CronTabManager - или как управлять crontab из админки

Для начала сразу оговорюсь, это не CronTabManager из репозитория modx.com! По этому пытаться сравнивать его смысла нету))

Компонент представляет из себя полноценный набор классов для управления crontab заданиями, по мимо того что он умеет записывать крон задания напрямую в crontab (можно проверить это на modhost.pro) у него еще есть ряд на мой взгляд отличных преимуществ:

  • Ведет логи запуска заданий
  • Отслеживает и уведомляет администратора сайта если задание завершилось с ошибкой после n количества попыток запуска
  • Возможность прочесть лог с ошибкой
  • Имеет уже встроенный набор классов для создания новых заданий (новое задание создается как контроллер для RESTfuil)
  • Позволяет запускать задание из админки точно так же как бы мы запускали его из под ssh пользователя
  • Блокировка заданий на n количества времени из письма
К примеру если у вас есть пару десятка крон заданий, то это уже вызывает сложности по управлению ими. Компонент решает все задачи по управлению такими задания. CronTabManager разрабатывается мною на протяжении уже 3-х лет, так что плюшек в нем достаточно.

В заметке опишу лишь базовые возможности компонента…


В настройка компонента есть параметр: crontabmanager_handler_class он принимает два класса:
CrontabManagerHandler — записывает задания в crontab
CrontabManagerHandlerFile — записывать задания в файл (которые нужно будет переносить в ручную)

класс CrontabManagerHandler может не работать на большинстве хостингов так как возможно много ограничений препятствовать этому.

Для полноценного теста компонент можно попробовать на modhost.pro, так как там разрешена запись задания напрямую в crontab из под веб пользователя.

Задания и контроллеры


Все контроллеры крон заданий хранятся в директории:
core/scheduler/Controllers/
Демонстрация как работает задания вы можете увидеть перейдя в админку. Во время установки у вас уже добавиться новое задание с название demo.php


Это задание запускает контроллер demo.php, путь к контроллеру
core/scheduler/Controllers/demo.php

Внимание!!! класс контроллера должен напрямую совпадать с именем файла контроллера


То есть ваше имя класса контроллере всегда должено начинаться с
CrontabController[ТУТ ПИШЕМ путь до файла относительно папки core/scheduler/Controllers/]

Что такое контроллеры?


Если вы пользовались когда то RESTfuil то для вам не составит труда разобрать как работаю контроллеры. Создаются и запускаются контроллеры по тому же принципу.

Если чуть подробней: когда вы включаете контроллер то автоматически создается карта контроллеров c ссылками на их запуск:


Почему нужно устанавливать компонент на modhost.pro?


Основная проблема в то что на большинстве хостинго права на запись в crontab менеджер из под веб пользователя ограничены. У вас попросту не добавиться задание в crontab.
Для таких хостигов я предусмотрел возможно смены контролера записи заданий. То есть задание будет писать не в crontab а в обычный файл из которого можно скопировать список заданий и перенести в ручную их в crontab


Компонент очень мощный, и решает комплекс задач связанных с фоновыми заданиями.

Так как скоро новый город))) Решил приурочить публикацию компонента к этому празднику и сделать его бесплатным для всех)))

Скоро компонент появиться на modstore.pro

Сейчас компонент скачать можно здесь

Если кому станет полезным компонент, то можно за донатить
Андрей Степаненко
20 декабря 2019, 08:38
modx.pro
2
2 744
+20
Поблагодарить автора Отправить деньги

Комментарии: 18

Николай Савин
20 декабря 2019, 11:06
+2
Выглядит просто потрясающе! За такое не жалко и заплатить, честно говоря. Зря бесплатным делаешь.
Я и не подозревал что php умеет писать в crontab
    Андрей Степаненко
    20 декабря 2019, 11:15
    +1
    Я и не подозревал что php умеет писать в crontab
    В это вся и загвоздка.
    Очень много серверов настроены именно так что у веб-пользователя нету прав писать задания в crontab.
    К пример сервера на ispmanager вообще не дают прав чтобы редактировать crontab даже под ssh
      Николай Савин
      20 декабря 2019, 11:45
      +1
      Ну тем не менее — новая для меня информация. Уже полезно, уже спасибо!
        @Андрей Степаненко,
        К пример сервера на ispmanager вообще не дают прав чтобы редактировать crontab даже под ssh
        Привет, сорри за некропост, но в ISPmanager Планировщик всегда же был: yadi.sk/i/0aSW8LA6B9kJVw
        Или имелось в виду, что редактировать автоматизированно (не руками в интерфейсе)?

        Я просто засомневался, вдруг выпилили чего в новых версиях. На одном старом проекте обновляться собрались…
      Сергей Шлоков
      20 декабря 2019, 11:51
      0
      Обычно работают так — настраивают крон раз в минуту, ставят дополнения типа Scheduler и создают задания в админке. Чем этот вариант лучше?
        Андрей Степаненко
        20 декабря 2019, 11:59
        +3
        Ну тут все просто, в отличии от Scheduler, в компоненте каждое задание это отдельно задание прописанное в кроне. а в Scheduler все вешается на одно задание.

        А так же есть вот эти штуки: Есть уведомления о том что задание завершилось с ошибкой, ведутся логи запуска и завершения задания, и пишет в crontab на прямую.

        В общем не стоит сравнивать компонент с какими то существующими. Аналогов для modx явно не найти.

        В компоненте можно любое количество контроллеров создать и запускаться будут по отдельности.

        В общем надо ставить пользоваться, я вот так простыми словами не опишу даже.
        Могу сказать только:
        у меня есть проекты где по 50 крон заданий, каждое задание может выполнять хоть час хоть одну минуту, вот и представь сколько будут выполнять задания через Scheduler
          Сергей Шлоков
          20 декабря 2019, 12:22
          0
          Понял. Тут тебе виднее. Мне хватает одного крона )
          Сам лично давно смотрю в сторону Horizon. Адаптировать к MODX с первого взгляда несложно. Сам бы это сделал, если бы был на пенсии )
            Андрей Степаненко
            20 декабря 2019, 12:27
            0
            Для нескольких крон заданий компонент наверное смысла ставить нету. Хотя опять же если не умеешь пользоваться crontab через ssh то этот компонент поможет составить список заданий. А потом просто скопировать их в crontab.
            Вообще очень спасают уведомления на емайл. Когда отваливается какой то скрипт или сервис, тебя не заваливает сообщениями об ошибке. Так как есть лимит не удачных попыток. К примеру если 10 раз задание завершилось с ошибкой то только после 10 раза уйдёт уведомление и цикл будет повторятся пока администратор не предпримет какое то действие, или работа скрипа не восстановится.
              Андрей Степаненко
              20 декабря 2019, 12:35
              +1
              В общем это не только крон задания, а так же система уведомлений и готовый API с modx внутри.
              Пример кода для создания нового задания
              <?php
              /**
               * Демонстрация контроллера
               */
              class CrontabControllerDemo extends modCrontabController
              {
                  public function run()
                  {
                      $this->modx->log(modX::LOG_LEVEL_ERROR, "Задание завершено", '', __METHOD__, __FILE__, __LINE__);
                  }
              }
              все что нужно чтобы в run выполнить свой код.
              В modCrontabController еще куча всяких фич. Надо все описывать конечно)))
          Oleg
          20 февраля 2020, 19:26
          0
          Здравствуйте. Компонент плохо удаляется, у меня после удаления в админке осталась вкладка crontabmanager, внутри которой сообщение «Could not find action file at: controllers/default/index.php». Я деинсталлировал и удалил пакет, а это осталось.
            Андрей Степаненко
            20 февраля 2020, 19:28
            0
            Дак это может ошибка в другом компоненте?
              Oleg
              20 февраля 2020, 19:32
              0
              Вкладка называется crontabmanager, я думаю, она должна была удалиться вместе с компонентом. Но не могу утверждать, что ошибка именно в crontabmanager. Можете подсказать, где можно почистить вкладку «Пакеты», чтобы вручную удалить эту строку?
                Андрей Степаненко
                20 февраля 2020, 19:35
                0
                Где ссылка на системные настройки, там есть ссылка меню, компоненты и правой кнопкой мыши
                  Oleg
                  20 февраля 2020, 19:56
                  0
                  Спасибо!
            Eugene Generalov
            19 октября 2020, 11:03
            0
            Почему может появляться ошибка «Не удалось добавить задание контроллер demo.php в crontab»? При включении задачи
              Андрей Степаненко
              19 октября 2020, 11:56
              0
              Покажи скрин
                Андрей Степаненко
                19 октября 2020, 14:05
                0
                Вообще надо создать файл core/scheduler/Controllers/demo.php
                Класс должен быть одноимённый

                CrontabControllerDemo extends modCrontabController
                Евгений Лазарев
                22 февраля 2022, 15:25
                0
                Установил плагин — у него потрясающий функционал. С какими проблемами столкнулся:
                1) мало документации.
                2) Так и не понял разницу CrontabManagerHandlerFile и CrontabManagerHandler.
                3) При активации и деактивации появляются ошибки и она становится невозможной (выполнил опытным путем удаляя задание через ispPanel)
                4) когда все же все заработало увидел ряд ошибок:
                PHP Fatal error:  Can't use method return value in write context in /var/www/site.ru/core/components/crontabmanager/model/crontabmanager/crontabmanagertasklog.class.php on line 10
                Данные ошибки связаны с этим файлом и crontabmanagertask.class.php на строках 99,222,231 (везде где написано if (EMPTY($this->get('tratata')))). Почему-то не нравится ему empty. При этом у меня php74 а запускатеся под 7.2
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  18