Расшифровка cron
Вставьте строку из crontab и узнайте, когда она на самом деле сработает. До того, как она сработает в три ночи не в тот день.
Работает в вашем браузере. Всё, что вы сюда вставляете или бросаете, никуда не загружается.
Пять полей, @сокращение или целая строка crontab с командой.
- 0Минута:000–59
- 3Час03:xx0–23
- *День месяцалюбой день1–31
- *Месяцкаждый месяц1–12, JAN–DEC
- 1-5День неделипн–пт0–7, SUN–SAT
В 03:00, с понедельника по пятницу.
Серверы часто запускают cron в UTC. Проверьте командой date или timedatectl на сервере.
Как пользоваться
- Вставьте строку из crontab: пять полей, сокращение вроде
@dailyили всю строку вместе с командой. - Прочитайте фразу. Поставьте курсор на поле, и оно подсветится в разборе.
- Проверьте предупреждения. Они ловят классические ошибки:
*в минутах, 31-е число и правило OR для дня месяца и дня недели. - Посмотрите ближайшие 10 запусков. Переключитесь на UTC, если сервер живёт в UTC, а большинство живёт.
Что он делает
Cron читает пять полей слева направо: минута, час, день месяца, месяц, день недели. 0 3 * * 1-5 значит 03:00 с понедельника по пятницу. В каждом поле можно писать числа, диапазоны (1-5), списки (1,15), шаги (*/15), а для месяцев и дней недели ещё и имена вроде JAN и MON. Воскресенье — это и 0, и 7.
Инструмент следует Vixie cron и cronie — тем cron, что стоят на большинстве Linux-серверов. Он понимает и выражения из шести полей с секундами (node-cron, Quartz, Spring), и синтаксис Quartz ? L W #, и предупреждает, если строка не сработает в обычном crontab.
Ближайшие запуски считаются в браузере, в вашем часовом поясе или в UTC. Переход на летнее время учитывается так, как его видит браузер: время, попавшее в «пропавший» час, сдвигается на первую минуту после него и помечается. Настоящие cron ведут себя здесь по-разному, так что не ставьте задачи между 02:00 и 03:00, если сервер живёт по местному времени.
Большинство cron-задач на небольших сайтах скучные и важные: продление сертификатов через certbot, резервные копии перед переносом аккаунта cPanel и запуск задач WordPress настоящим cron вместо WP-Cron, как в чек-листе безопасности WordPress. Сломанный cron не выдаёт ошибок. Он просто перестаёт что-то делать.
Вопросы
Что значит */5 в cron?
*/5 — это каждое пятое значение, начиная с наименьшего. В поле минут это :00, :05, :10 и так далее, то есть каждые 5 минут. Шаг начинается заново каждый час, поэтому шаги, на которые 60 не делится (например, */7), оставляют короткий промежуток в начале часа. 10-30/5 ограничивает тот же шаг минутами с 10-й по 30-ю.
Почему cron-задача запустилась не в тот день?
Скорее всего, из-за правила дня месяца и дня недели. Если заданы оба поля, cron запускает задачу, когда совпадает любое из них. 0 0 1 * 1 сработает 1-го числа и в каждый понедельник, а не только в понедельник, выпавший на 1-е. Поле, которое начинается с *, например */2, считается незаданным и переключает правило на «должны совпасть оба». Для «первого понедельника» поставьте 1-7 в день месяца, * в день недели и проверяйте день недели в самой команде.
В каком часовом поясе работает cron?
В системном часовом поясе сервера, если только ваш cron не поддерживает CRON_TZ (cronie поддерживает) или задача сама не задаёт TZ. Многие серверы живут в UTC, так что 0 3 * * * может сработать в 06:00 по вашему времени. Проверьте командой date или timedatectl на сервере и воспользуйтесь переключателем UTC выше.
Почему команда работает в терминале, но не в cron?
Cron запускает её с минимальным окружением: короткий PATH, без алиасов, часто другой shell, а % означает перевод строки. Пишите полные пути вроде /usr/bin/php, экранируйте % как \% и отправляйте вывод в лог (>> /tmp/job.log 2>&1), чтобы видеть, что пошло не так.
Как посмотреть и отредактировать свои задачи cron?
crontab -l показывает ваши задачи, а crontab -e открывает их в редакторе. У каждого пользователя свой crontab, поэтому задача, добавленная от root, под вашим пользователем не видна: sudo crontab -l покажет задачи root. Системные задачи лежат ещё в /etc/crontab и /etc/cron.d/, и в этих строках между расписанием и командой есть лишнее поле: пользователь, от имени которого запускать. На хостинге без доступа к shell ищите в cPanel Задания cron (Cron Jobs).