Проверяйте сверху вниз. Сначала работает ли сам cron, потом видит ли он задачу, запускает ли её и чем она заканчивается. На каждом шаге одна-две команды.
Команды ниже для Linux с systemd: Ubuntu, Debian, CentOS, AlmaLinux. В Ubuntu и Debian сервис называется
cron, в CentOS и AlmaLinux — crond.
Шаг 1. Запущен ли cron
systemctl status cron
В выводе должно быть active (running). Если cron остановлен, запустите его и включите автозапуск:
sudo systemctl enable --now cron
Шаг 2. Есть ли задача в crontab
crontab -l
Команда показывает crontab текущего пользователя. Задачи других пользователей так не видны. Если задача
должна работать от deploy, а Вы зашли как root, смотрите так:
sudo crontab -u deploy -l
Задача может быть и в системных файлах: /etc/crontab и /etc/cron.d/. Найти её по имени скрипта можно так:
sudo grep -r backup.sh /etc/crontab /etc/cron.d/ /var/spool/cron/
Заодно проверьте само расписание. * 3 * * * и 0 3 * * * выглядят похоже, но первое запускает задачу 60
раз подряд. Разобрать выражение можно в руководстве о расписании cron.
Шаг 3. Запускает ли cron задачу
Cron пишет в системный журнал строку при каждом запуске. Посмотреть записи за последний час (в CentOS и
AlmaLinux вместо cron пишите crond):
journalctl -u cron --since "1 hour ago"
Или в файле журнала, если он есть:
grep CRON /var/log/syslog # Ubuntu, Debian
sudo tail /var/log/cron # CentOS, AlmaLinux
Запись о запуске выглядит так:
CRON[48213]: (deploy) CMD (/home/deploy/backup.sh)
Если такой строки нет в то время, когда задача должна была запуститься, cron её не запускал. Значит, проблема в расписании, в crontab или в часовом поясе. Время в журнале указано в часовом поясе сервера, сравните его с расписанием.
Если строка есть, cron задачу запустил, и дальше нужно смотреть, чем она закончилась.
Шаг 4. Работает ли cron вообще
Если непонятно, виновата задача или cron, добавьте тестовую задачу, которая каждую минуту пишет время в файл:
* * * * * date >> /tmp/cron-test.log 2>&1
Через пару минут проверьте файл:
cat /tmp/cron-test.log
Если строки с датой появляются, cron работает, и дело в самой задаче. Не забудьте потом удалить тестовую строку из crontab.
Шаг 5. Чем закончилась задача
Чтобы видеть, что задача напечатала и с какой ошибкой упала, направьте её вывод в файл:
0 3 * * * /home/deploy/backup.sh >> /var/log/backup.log 2>&1
2>&1 нужен, чтобы в файл попадали и ошибки. После следующего запуска откройте /var/log/backup.log.
Частые ошибки, которые там окажутся:
command not found— у cron короткийPATH. Укажите полный путь к программе, его покажетwhich php;Permission denied— у скрипта нет права на запуск (chmod +x backup.sh) или задача работает от пользователя, которому не хватает прав;No such file or directory— скрипт открывает файлы по относительному пути, а cron запускает его из домашней папки. Добавьтеcdв нужную папку перед командой.
Шаг 6. Запустить команду так, как её запускает cron
В терминале команда работает, а по cron нет — так бывает, потому что у cron другое окружение. Запустите команду с таким же коротким окружением:
env -i HOME="$HOME" SHELL=/bin/sh PATH=/usr/bin:/bin /bin/sh -c '/home/deploy/backup.sh'
Если и так упадёт, Вы увидите ошибку сразу, без ожидания следующего запуска. Обычно причина в PATH или
в переменных окружения, которые есть в терминале, но не в cron.
Шаг 7. Узнавать о сбоях сразу
Всё, что выше, помогает разобраться, когда Вы уже знаете о проблеме. Но cron сам не сообщает, что задача упала или перестала запускаться. Журнал и лог нужно открывать самому, и на практике это делают, когда бэкап уже понадобился.
Надёжнее, когда задача сама сообщает, что отработала, а кто-то ждёт этого сообщения. Если оно не пришло вовремя, приходит алерт. Такой подход называют dead man's switch, и на нём работает Steadrun. В конец строки crontab добавляется запрос на адрес проверки:
0 3 * * * /home/deploy/backup.sh && curl -fsS -m 10 --retry 3 -o /dev/null https://steadrun.ru/ping/ВАШ-UUID
Если бэкап упадёт, зависнет или cron перестанет его запускать, запроса не будет, и Steadrun пришлёт алерт в Telegram или на почту. Настройка занимает пять минут, она описана в быстром старте. Бесплатно можно следить за пятью задачами.
Что дальше
- Crontab и расписание cron: синтаксис, примеры и частые ошибки.
- Рецепты: обёртка, которая отправляет в алерт текст ошибки задачи.