Как я организовал полную автономность сервера. Сказ о том как автоматизировать несколько шаблонов.

Discussion in 'Десятый конкурс статей' started by backoff, Dec 11, 2018.

  1. backoff

    backoff Client

    Joined:
    Apr 20, 2015
    Messages:
    2,431
    Likes Received:
    1,945
    ВНИМАНИЕ!!! Техническая статья. Максимум полезности, минимум мимишности!

    Вся эта история началась почти год назад.
    Будет много текста, запасись водичкой/чайком/кофейком и терпением :-)
    Надеюсь будет полезно и интересно, короче судите сами. Писать много не люблю, по этому постараюсь только по сути :-)

    Итак. Самое главное что вам надо знать это по сути 2 вещи, а точнее 2 сниппета (если шабы завязаны на время)

    1. подсчет количества потоков в исполняемом шабе
    Code (text):
    1. string status = string.Empty;
    2. for(int a = 0; a < 10; a++)
    3.    {
    4.    var yourname = "ИМЯ_ШАБЛОНА";//имя шаблона
    5.    var tasks = ZennoPoster.TasksList;
    6.    foreach(var task in tasks)
    7.    {
    8.      var doc = new System.Xml.XmlDocument();
    9.      doc.LoadXml("<Task>" + task + "</Task>");
    10.      string name;
    11.      var nameNode = doc.SelectSingleNode("Task/Name");
    12.      if(nameNode != null && nameNode.InnerText.Equals(yourname))
    13.      {
    14.     name = nameNode.InnerXml;
    15.        //ZennoPoster.AddTries(name, 1);
    16.          if (Global.Variables.IsProjectMaker) if (!Global.Variables.IsDebugMode) break;
    17.          status = doc.SelectSingleNode("Task/ExecutionSettings/NumberOfTries").InnerText;
    18.          //Complete
    19.          return status;
    20.      }
    21.    }
    22. }
    Скрипт отвечает за подсчет сколько в данный момент стоит количества исполнений в зенке. Соответственно зенка должна быть запущена и шаб который надо проверять должен работать, тогда будет отдача числа. Если нет, то ответ будет просто - ок
    Имя шаблона обязательно писать латиницей (вообще не понимаю людей, которые в названиях или путях указывают кириллицу)

    potok.jpg

    Из примера, сниппет возьмет значение 1002. Теперь мы знаем, что до полной остановки шаблона 1002 исполнения.
    НО каждое исполнение - это не всегда одно и тоже время, так как работа идет в нете, а не на локальной машине.
    Из этого вам надо знать и этот сниппет.

    2. Работа со временем, не маловажный момент вообще в принципе.
    Code (text):
    1. return (long)(DateTime.UtcNow - new DateTime (1970, 1, 1)).TotalSeconds; //берем время в unixtime в этот момент
    Code (text):
    1.  
    2. // считаем сколько времени прошло в секундах
    3. int time_end = int.Parse(project.Variables["time_end"].Value);
    4. int time_start = int.Parse(project.Variables["time_start"].Value);
    5. return time_end - time_start;
    итак давайте чуть подробнее.

    • верхним сниппетом берем время в начале шаблона и кладем в переменную time_start
    • верхним сниппетом берем время в начале шаблона и кладем в переменную time_end
    • нижним сниппетом делаем вычитание и получаем время в секундах за которое шаблон был исполнен
    Это вообще очень удобно, для наглядности иметь понимание среднего времени исполнения шаблона. В будущем такое простое действие может сильно помочь в задачах.

    Ну теперь включается самое сложное - логика )

    Итак, например, у нас есть 5 шаблонов, отвечающие за разные действия. Нам нужно продумать последовательность и учесть погрешности, плюс помнить о времени! Потому что в моем случае, я мог делать запуск всего 1 раз в сутки.

    Логика шаблона:
    У каждого шаблона есть свой файл с акками.
    1. После исполнения задания в конце всегда записываем время конца исполнения в таблицу, делаем поментку, когда акк сделал задание, записываем.
    2. Сделали пометку о самом выполнение, как оно прошло, удачно - ОК, если с ошибкой = Bad, или выполнено, но с задачей не справился = None
    3. Сохранили куки профиль
    4. ну понятное дело записываем обратно в все входящие переменные как прокси лог пас и тп

    Логика шаблона манагера!
    Началось )))

    У шаблона конечно же есть свой файл конфига, он состоит из 2х параметров
    1. это конец времени работы последнего шаблона
    2. и порядковый номер шаблона
    выглядит просто
    время;номер

    Шаблон манагера запускается каждые 3 минуты средствами самой зенки.
    После запуска шаблон делает анализ. Если все ок, начинает старт с номера 1, запуская первый шаблон с помощью .bat файла

    Code (text):
    1. @echo off
    2. echo Starting task... (-names "ИмяШаблонаБезПробелов")
    3. "C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\5.16.2.0\Progs\TasksRunner.exe" -o StartTask -names "ИмяШаблонаБезПробелов"
    4. timeout /t 1
    5. echo Set tries count to 5870... (-names "ИмяШаблонаБезПробелов")
    6. "C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\5.16.2.0\Progs\TasksRunner.exe" -o SetTries 7665 -names "ИмяШаблонаБезПробелов"
    7. timeout /t 1
    8. echo Clear success... (-names "ИмяШаблонаБезПробелов")
    9. "C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\5.16.2.0\Progs\TasksRunner.exe" -o ClearSuccess -names "ИмяШаблонаБезПробелов"
    10. timeout /t 1
    11. echo Set threads count to 10... (-names "ИмяШаблонаБезПробелов")
    12. "C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\5.16.2.0\Progs\TasksRunner.exe" -o SetThreads 10 -names "ИмяШаблонаБезПробелов"
    Данный батник легко можно сделать под свои нужды по средствам зенки.
    7665 - это количество исполнений
    10 - количество одновременных потоков

    Когда шаб 1 запущен, идет перезапись конфига, теперь цифра 0 заменилась на 1.

    При следующем запуске менеджера происходит проверка конфига.
    Проверяем время, сутки не прошли, идем дальше, проверяем номер шаблона. Манагер видит что шаблон 1 уже был запущен, и надо запускать шаблон номер 2. НО перед этим надо проверить количество исполнений на данный момент времени. Делаем проверку сниппетов выше. Манагер видит, что исполнения не равны нулю, поэтому манагер уходи в даун на следующие 3 минуты, через 3 минуты, операция происходит заново.

    ispolneniya.jpg

    В конце работы шаблона есть разделение на 2 проверки
    1. если все ок, то количество исполнений и потоков равно нулю.
    2. проверка на то что какой-то из потоков поймал "цикл", то есть делает в шабе что-то где ты не предугадал. Например страница не прогрузилась полностью, и шаб вставляет текст, в коде вроде как есть, но не работает. Мы делаем проверку

    • зная количество потоков мы делаем проверку количества потоков, ЕСЛИ количество исполнений равно нулю.
    • Если потоки висят в работе больше среднего времени исполнения шаблона, то убиваем их (я увеличил время среднее с 30 секунд до 5 минут, чтоб наверняка, иногда бывает просто прокси тупят, редко очень, но бывает)
    Убиваем их этим батником (точно так же можно сделать средствами зенки)
    Code (text):
    1. @echo off
    2. echo Interrupting task... (-names "ИмяШаблонаБезПробелов")
    3. "C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\5.16.2.0\Progs\TasksRunner.exe" -o InterruptTask -names "ИмяШаблонаБезПробелов"
    4. timeout /t 1
    5. echo Set tries count to 0... (-names "ИмяШаблонаБезПробелов")
    6. "C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\5.16.2.0\Progs\TasksRunner.exe" -o SetTries 0 -names "ИмяШаблонаБезПробелов"
    Дальше.
    Мы имеем отработавший шаблон, теперь надо сделать об этом отчет. Просматриваем файл аккаунтов на bad'ы, считаем их, записываем. Отправляем телегу отчет.
    telega1.jpg

    из данного отчета, мы берем инфу (для себя) количество ошибок, время старта.
    1. если количество ошибок по вашему мнению в пределах нормы, значит все ок
    2. Если время запуска в пределах среднего, значит все ок
    Вывод, все ок, на сервак не лезем для детального просмотра и регулировки.

    Таким образом организуем последовательность исполнения шаблонов.
    Почему это удобно?
    1. так как среднее время исполнения может быть увеличено, поэтому стандартными способами мы не можем предугадать когда первый шаб будет полностью выполнен и нагрузка на сервак будет минимальной для запуска следующего.
    2. Гибко можно следить за залипанием инстантсов и циклов в них (в последних версиях зенки такое тоже уже можно делать самой зенкой, выключать по истечению времени)
    Так же отдельно манагер следит за рабочими и битыми ссылками, и если что запускает их новое создание. Создание ссылок происходит по 2м причинам:
    1. ссылки не работают, были забанены или медленно открываются
    2. по истечении времени, то есть если прошла неделя ил две, то создаются новые ссылки и перезаписываются
    Вот пример алерта о ссылках

    telega-ssilki.jpg

    То есть запускается шаб которые отслеживает работоспособность ссылок, если найдены битые ссылки, то автоматом их удаляет из базы и делает оповещение.
    Если рабочих ссылок - 0
    Останавливаются все шаблоны и запускается новая генерация ссылок.
    Если пришло время менять ссылки, то система ждет когда все шаблоны будут выработаны и нет нагрузки на сервер, тогда идет запуск шаба по ссылкам.

    telega-ssilki2.jpg

    День когда почти пришлось вмешаться )
    Но манагер вывез.

    _______ Дополнил ________
    Так выглядит аккаунт если какие-то были забанены, а число исполнений не изменилось. То есть было 1000 акков, а стало 997, а в батнике не изменили число акков, то будем видеть такую картину.
    То есть контроль каждого акка идет еще и в самих шаблонах при старте, проверка времени.

    spot2.jpg


    ps\ когда надо было сделать что-то подобное средствами зенки, на тот момент она не умела этого, и не уверен что сейчас можно организовать так же гибко. Но научившись такое продумывать и зная эти 2 сниппета, можно написать любой манагер по сути, для любых задач.

    pss\ судя по последним темам в конкурсах, где я принимал участие с финансовым отчетом, никому не интересно было слушать про деньги, поэтому в этот раз опущу эти цифры ))))

    Надеюсь было полезно, если чего вспомню, допишу.

    [​IMG]
     
    Last edited: Dec 12, 2018
    demin, alexgrand, linkod and 65 others like this.
  2. AZANIR

    AZANIR Client

    Joined:
    Jun 9, 2014
    Messages:
    256
    Likes Received:
    101
    Классная техническая статья , удобоваримо и применимо спасибо!
     
  3. vrska

    vrska Client

    Joined:
    Feb 7, 2010
    Messages:
    210
    Likes Received:
    73
    Верно, а еще я вообще не понимаю людей, которые не отключают уведомления о выполнении проекта, по итогу в логе мусор и замазаный скрин, то же про скрины с тг, почему бы не заскринить без списка контактов?
    Ты свой манагер называешь манагером, снипетом, шаблоном который проверяет другие шаблоны и если этот шаблон.... чтоооо, какой этот? Чем больше я перечитывал статью, тем больше путался
     
    one and AZANIR like this.
  4. backoff

    backoff Client

    Joined:
    Apr 20, 2015
    Messages:
    2,431
    Likes Received:
    1,945
    я не часто обращаю внимания на мелкие доработки, как это, поэтому даже и не знал об этом)))
    так создается более полное впечатление, мозгом это пространство расширяется, а вообще я не люблю мелкие скрины, по сути я мог бы все скрины урезать до одной строчки, но разве это будет смотреться? Нет конечно, смотрится большой скрин, хоть и замазанный...
    Да и тема не о скринах, просто с ними тема живее смотрится.

    ps \ но кстати когда писал статью, она у меня спонтанно родилась, если честно, когда делал скрины, тоже подумал о том как бы было здорово убрать лишнее из логов)
     
    Last edited: Dec 11, 2018
  5. one

    one Client

    Joined:
    Sep 22, 2015
    Messages:
    4,816
    Likes Received:
    810
    А зря! Люди любят считать чужие деньги. Так что давай, выкладывай инфу и поподробнее! )))

    Материал понравился. Буду голосовать!
     
    vladinvest, backoff and Tsuk15 like this.
  6. Tsuk15

    Tsuk15 Client

    Joined:
    Apr 25, 2017
    Messages:
    87
    Likes Received:
    26
    Круто)) давно думал о том, чтобы внедрить что-то подобное. Теперь стало понятнее как это реализовать под мои нужны
     
  7. backoff

    backoff Client

    Joined:
    Apr 20, 2015
    Messages:
    2,431
    Likes Received:
    1,945
    да в лом :-)
    могу лишь сказать что на новый немецкий бизнес класс хватит :-)

    :ay:
    рад что познавательно, и помогло
     
  8. Shytov

    Shytov Client

    Joined:
    Sep 11, 2018
    Messages:
    9
    Likes Received:
    4
    Ооо, спасибо добрый человек! Я как раз сейчас нечто похожее делаю
     
    Tsuk15 likes this.
  9. Tsuk15

    Tsuk15 Client

    Joined:
    Apr 25, 2017
    Messages:
    87
    Likes Received:
    26
    не туда:D
     
  10. Сибиряк

    Сибиряк Client

    Joined:
    Jul 12, 2014
    Messages:
    255
    Likes Received:
    61
    Вот блин почему бы не взять авторам ЗП и не сделать нормальный планировщик?
    ++++
     
  11. backoff

    backoff Client

    Joined:
    Apr 20, 2015
    Messages:
    2,431
    Likes Received:
    1,945
    я предлагал давно такое сделать :-)
    с другой стороны зная такие сниппеты, без проблем можно свой планировщик сделать, пусть лучше хром развивают и дебажат ))
     
    Сибиряк likes this.
  12. Сибиряк

    Сибиряк Client

    Joined:
    Jul 12, 2014
    Messages:
    255
    Likes Received:
    61
    Это не программа автоматизации тогда получается, а "НИИ травматологии и ортопедии"
     
    backoff likes this.
  13. systema

    systema Client

    Joined:
    Jul 25, 2013
    Messages:
    120
    Likes Received:
    35
    Вот такие ошибки из-за чего могут быть
    Компиляция кода Ошибка в действии "CS0234" "Имя типа или пространства имен "XmlDocument" отсутствует в пространстве имен "System.Xml" (пропущена ссылка на сборку?)". [Строка: 7; Cтолбец: 31]
     

Пользователи просматривающие тему (Пользователей: 0, Гостей: 0)