Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумСофт и программы

Планировщик задач: cron, systemd или менеджер очередей

queue_master
queue_master
Участник
сообщений 410
с ноя
1 января, 08:12первое сообщение

На сервере пять ночных прогонов, все висят в crontab. Работает, пока не начинает.

За последний месяц два раза наложились друг на друга: первый не успел, второй стартовал по расписанию, вдвоём съели память и оба легли. Плюс после перезагрузки утренний прогон просто пропустился, узнал я об этом к обеду.

Думаю переезжать. Что брать: таймеры systemd или сразу менеджер очередей?

очередь длиннее памяти
iron_shell
iron_shell
Знаток
сообщений 1050
с июн
8 июня, 11:29#2

Наложение лечится в одну строку, переезжать ради него не нужно:

0 2 * * * /usr/bin/flock -n /tmp/nochnoy.lock /opt/progon/start.sh

Флаг -n означает «занято, значит уходим молча». Хотите, чтобы второй дождался первого, уберите -n.

С пропуском после перезагрузки хуже, cron про пропущенные запуски не помнит вовсе. Вот тут таймер выигрывает:

[Unit]
Description=Ночной сбор

[Timer] OnCalendar=*-*-* 02:00:00 Persistent=true RandomizedDelaySec=900

[Install] WantedBy=timers.target ```

Persistent=true догоняет пропущенный запуск сразу после старта машины. RandomizedDelaySec растаскивает пять прогонов по времени, чтобы они не стартовали в одну секунду. И весь вывод сам ложится в журнал, journalctl -u nochnoy.service показывает прошлые запуски с кодами выхода, никаких перенаправлений в файл руками.

Женя Ковалёв
Женя Ковалёв
Новичок
сообщений 62
с авг, второй сезон
15 ноября, 14:46#3

а флок точно работает если скрипт убили по kill -9?

queue_master
queue_master
Участник
сообщений 410
с ноя
22 апреля, 17:03#4
iron_shell: Persistent=true догоняет пропущенный запуск сразу после старта машины

Ради одного этого стоит переехать, утренний пропуск мне и стоил нервов.

Женя Ковалёв, при kill -9 блокировка снимается ядром вместе с процессом, файл остаётся лежать пустой и никому не мешает.

очередь длиннее памяти
Пётр Мельник
Пётр Мельник
Участник
сообщений 810
с июл
1 сентября, 08:20#5

Очередь нужна, когда у задачи появляется своя судьба: повтор через растущую паузу, разбор по частям, догон упавших кусков, несколько машин на одну работу.

Пока это пять ночных запусков на одном сервере, очередь добавит вам хранилище, отдельный процесс исполнителя и новый класс поломок. Признак, что пора: вы начали писать в скрипте таблицу состояний с попытками.

Промежуточный шаг дешевле: таймер запускает мелкий раздатчик, тот кладёт куски в обычный файл и следит за упавшими.

сначала замер, потом мнение
queue_master
queue_master
Участник
сообщений 410
с ноя
8 февраля, 11:37#6

Перевёл все пять на таймеры, разброс по десять минут каждому. Неделя без наложений, вывод читаю журналом.

Очередь отложил, у меня правда пока нет таблицы попыток.

очередь длиннее памяти