Почему скрипт работает руками, но падает из cron

Скрипт запускается из терминала без ошибок, при добавлении той же команды в crontab — ничего. Само расписание при этом может быть совершенно правильным.
Все потому что у cron другое окружение. Он не подхватывает настройки из ~/.bashrc, PATH может отличаться от интерактивной shell-сессии, относительные пути вести не туда, а stderr вообще потеряться, если его заранее никуда не направить. Поэтому для cron-задач лучше сразу указывать абсолютные пути к командам и сохранять вывод в лог.
Например:
*/10 * * * * /opt/scripts/sync.sh >> /var/log/sync.log 2>&1
Если задача не запускается, начать можно с самого cron:
systemctl is-active cron journalctl -u cron --since today
Если запись о запуске есть, а результата нет, стоит проверить окружение, права пользователя и пути. Скрипт можно отдельно прогнать почти без переменных окружения:
env -i /bin/sh -c '/opt/scripts/sync.sh'
Так быстрее всплывают зависимости от PATH и других переменных, которые были доступны в обычном терминале.
Есть еще несколько мелочей, на которых cron легко ломается:
В
crontabсимвол % имеет специальное значение. Поэтому, например, вdate +%Fего нужно экранировать:date +\%F.В файлах
/etc/cron.d/последняя запись должна заканчиваться переводом строки. Иначе cron может ее просто пропустить.@rebootзапускает задачу после старта системы, но не ждет, пока поднимутся сеть, база или сетевой диск. Если скрипт от них зависит, удобнее описать зависимости через systemd.Если предыдущий запуск еще не закончился, cron спокойно может запустить второй экземпляр. Для простых задач от этого защищает
flock.
Сам cron хорошо подходит для независимых задач по расписанию. Когда нужно выполнить пропущенный запуск после простоя, дождаться другого сервиса или ограничить ресурсы процесса, возможностей одной строки в crontab уже мало. В Ubuntu для таких сценариев есть anacron и systemd timers: у последних можно задавать зависимости, сохранять пропущенные запуски через Persistent=true и смотреть логи через journalctl.
В блоге Рег.облака собрали полную шпаргалку по cron в Ubuntu: синтаксис расписания, пользовательские и системные задания, примеры для бэкапов и обслуживания сервера, диагностику, права и секреты, а также сравнение cron с anacron и systemd timers.


















