Быстрый способ запускать задачи в cron с шагом 30 секунд
Как оказалось многие не знают, как нативным cron
(без systemd timers) запускать скрипты с интервалом в 30 секунд, без модификации самого скрипта.
Все довольно просто и очевидно. Нужно сделать бутерброд.
ЧИТАТЬ ПЕРВЫМ В ТЕЛЕГРАМCron исторически работает только с минутной точностью. В
crontab
нельзя написать «каждые 10 секунд» или «раз в 30 секунд». Для этого обычно используюsystemd timers
или отдельный демонический скрипт сwhile true; sleep ...
В crontab
строка запускается раз в минуту. Но внутри можно поставить sleep
— задержку перед запуском. Таким образом мы получим несколько запусков в рамках одной минуты.
* * * * * /usr/local/sbin/bashdays.sh
* * * * * sleep 30; /usr/local/sbin/bashdays.sh
Первая строка запускает скрипт в начале минуты (00:00, 00:01, 00:02…)
Вторая строка — ждёт 30 секунд и запускает скрипт (00:00:30, 00:01:30, 00:02:30…).
Тут и получаем шаг в 30 секунд, именно через 2 вызова.
Костыльно? Ага! Но порой не хочется ебаться с таймерами и сделать все по-быстрому. Как вариант, вполне годный. Аналогично можно городить и другие интервалы.
Минусы подхода
- Нет гарантии точности. Если первый запуск скрипта будет работать дольше, чем пауза (
sleep
), запуски могут наложиться. - Мусор в crontab. Для мелкого интервала надо плодить много строк.
- Нет гибкой логики.
Где это реально полезно
- Лёгкие скрипты мониторинга (ping, проверка статуса).
- Хаотизация нагрузки (например,
sleep $((RANDOM % 60))
для рассинхрона). - Если
systemd timers
или другие планировщики недоступны (например, в ограниченных окружениях или старых системах).
А как работать с таймерами ищи по тегу #systemd в моём телеграм канале, много про это писал.