Планировщик

Встроенный планировщик запускает скрипты по расписанию — для этого не нужен ни «крон» на сервере (системный планировщик задач), ни другие внешние инструменты. Всё расписание — это один файл schedule.yml в папке скриптов, которым управляет агент: вы просите в чате «запускай каждый день в 9 утра» — агент вносит запись сам.

Как устроено расписание

Файл schedule.yml — это список записей. У каждой записи:

  • id — название записи;
  • script — путь к скрипту внутри папки;
  • описание — зачем эта задача;
  • и одно из двух: every — интервал (например, 15m, 24h, 7d) или cron — точное время по полям: минута, час, день месяца, месяц, день недели (по UTC);
  • дополнительные флаги: enabled (запись включена), overlap — что делать, если прошлый запуск ещё идёт (пропустить или поставить в очередь), catchUp — догонять ли пропущенные запуски;
  • и по желанию: args — параметры, которые уйдут скрипту, timeoutMinutes — предельное время работы именно этой записи, hooks.afterRun — связки «после запуска» (о них ниже).

Интервалы: без дрейфа

Новая запись с интервалом запускается сразу, а дальше тикает по фиксированной сетке: каждые 15 минут, каждые 24 часа — точно, без накопления задержек. Если приложение простаивало (например, сервер перезагружался), следующий запуск — первая точка сетки в будущем, а не «плавающее» время от включения.

Точное время

Запись с точным временем ждёт совпадения по часам (UTC): «каждый будний день в 7:00». Выражения, у которых будущих срабатываний нет (например, 31 февраля), не теряются — перепроверяются позже.

Валидация «всё или ничего»

Весь файл проверяется целиком: одна плохая запись — и весь новый файл отклоняется, а действует последняя рабочая версия расписания. Сломать расписание одной опечаткой невозможно, данные не останутся без запусков. Отсутствие файла — не ошибка: просто расписания нет, ничего не запускается.

Пропущенные запуски

Если время запуска пришло, пока приложение было выключено, запуск выполнится при старте (если включён catchUp) или будет пропущен по правилам очереди. Запуски не теряются молча — поведение всегда предсказуемо.

Связки «после запуска»

Часто один запуск тянет за собой другой: выгрузили сырые данные — надо пересобрать по ним базу для отчётов. Раньше для этого заводили вторую запись расписания и надеялись, что она не сработает раньше выгрузки. Теперь у записи есть связки «после запуска» (в файле — hooks.afterRun): скрипт, который запускается после завершения запуска самой записи.

Для каждой связки указывают, когда её запускать: после успеха (по умолчанию), после ошибки или в любом случае. Так выгрузка и сборка идут строго друг за другом, а если выгрузка упала — это вовремя заметит скрипт-проверка.

Связка — это обычный запуск: у неё своя строка в истории, свой вывод, её можно остановить. На запуске видно, что он стартовал после родительского, и есть ссылка на этот родительский запуск. Ошибка связки не переписывает итог родительского запуска — тот уже завершён. Связки не ветвятся: связка сама новых связок не запускает, цепочка на ней заканчивается. На одну запись можно задать до восьми связок.

Управление в интерфейсе

Раздел «Планировщик» показывает все записи: что запускается, когда и с каким интервалом, какие связки «после запуска» у записи заданы. Отсюда можно приостановить всё расписание целиком, поставить на паузу одну запись, запустить скрипт прямо сейчас кнопкой «Запустить сейчас» и посмотреть историю запусков по расписанию. Сам файл в интерфейсе не редактируется: изменения расписания просите в чате — агент обновит schedule.yml, а правки подхватятся на лету, без перезапуска приложения.

Читайте также: Запуски, Чат с агентом.

← Оглавление документации