bitlvl
RU

Шпаргалка по cron

Порядок полей, расписания, которые реально нужны, и три подводных камня, на которые приходится большинство тикетов «моя cron-задача не запускается».

Помещается на одну вертикальную страницу A4 / Letter; выберите «Сохранить как PDF» в диалоге печати, чтобы оставить себе копию.

Синтаксис

┌─ минута (0–59)
│ ┌─ час (0–23)
│ │ ┌─ день месяца (1–31)
│ │ │ ┌─ месяц (1–12, jan–dec)
│ │ │ │ ┌─ день недели (0–7, sun–sat; 0 и 7 = воскресенье)
* * * * *  команда
*каждое значение
5ровно 5
1-5диапазон
*/15каждое 15-е
1,15список
8-18/2шаг внутри диапазона

Специальные строки

@rebootодин раз при загрузке
@hourly0 * * * *
@daily / @midnight0 0 * * *
@weekly0 0 * * 0
@monthly0 0 1 * *
@yearly / @annually0 0 1 1 *

Расписания

* * * * *каждую минуту
*/5 * * * *каждые 5 минут
*/15 9-17 * * 1-5каждые 15 мин, в рабочие часы, по будням
0 * * * *ежечасно, в начале часа
30 * * * *ежечасно в :30
0 */6 * * *каждые 6 часов (0, 6, 12, 18)
0 0 * * *ежедневно в полночь
0 3 * * *ежедневно в 03:00
30 6 * * 1-5по будням в 06:30
0 9,17 * * 1-5по будням в 09:00 и 17:00
0 0 * * 0по воскресеньям в полночь
0 0 * * 6,0по выходным
0 0 1 * *первого числа месяца
0 0 1,15 * *1-го и 15-го
0 0 1 */3 *ежеквартально (1 янв, апр, июл, окт)
0 0 1 1 *ежегодно
0 0 * * 1#1первый понедельник (нестандартно; используйте 0 0 1-7 * 1)
0 0 1-7 * 1первый понедельник — осторожно: срабатывает в дни 1–7 ИЛИ в любой понедельник; добавьте проверку [ $(date +\%u) = 1 ]
0 0 28-31 * * [ $(date -d tomorrow +\%d) = 01 ] && cmdпоследний день месяца
0 2 * * * sleep $((RANDOM \% 1800)); cmd02:00 со случайной задержкой до 30 мин

Подводные камни

  • PATH минимальный (/usr/bin:/bin). Используйте абсолютные пути или задайте PATH=… в начале crontab.
  • % в команде означает перевод строки; пишите \% (date +\%F).
  • Профиль оболочки не загружается: алиасы, nvm, rbenv, venv недоступны.
  • Часовой пояс — у демона (обычно системный, на серверах часто UTC). CRON_TZ=Europe/Belgrade работает в cronie.
  • День месяца И день недели заданы оба = запуск при совпадении любого из них.
  • Вывод отправляется почтой пользователю; перенаправьте его или задайте MAILTO=.
  • Наложение: cron запускает задачу снова, даже если предыдущая ещё работает. Оберните в flock -n /tmp/job.lock cmd.

Команды

crontab -eредактировать свой crontab
crontab -lпоказать
crontab -rудалить всё (без подтверждения!)
crontab -u www-data -lcrontab другого пользователя (root)
/etc/crontab, /etc/cron.d/*системные crontab: после расписания есть поле пользователя
/etc/cron.{hourly,daily,weekly,monthly}/скрипты-вкладыши, на десктопах запускаются anacron
grep CRON /var/log/syslog; journalctl -u cronпосмотреть, что запускалось

Безопасный шаблон

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[email protected]
SHELL=/bin/bash
# m h dom mon dow  command
30 6 * * 1-5  flock -n /run/backup.lock /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Результаты и сообщения этого инструмента выводятся на английском языке.

Вопросы

Как проверить, что означает выражение cron?

Вставьте его в объяснитель cron; он выведет расписание словами и десять следующих времён запуска в вашем часовом поясе.