Cron в Linux — простой и надёжный планировщик, но у него есть типичная «подлянка»: окружение задания не равно окружению вашей интерактивной оболочки. Поэтому cronjob отлично отрабатывает при ручном запуске в терминале, но по расписанию падает с загадочными ошибками: «command not found», не находится Python/Node, не подхватываются переменные, не видны ключи/конфиги, не та кодировка, не тот текущий каталог.
Ниже — практичный разбор, как cron запускает команды, что такое crontab-переменные (включая PATH), где искать логи (в том числе /var/log/cron), и когда имеет смысл выбрать systemd timers вместо cron.
Как cron запускает команды: главное отличие от терминала
Когда вы запускаете команду в SSH-сессии, её окружение формируется оболочкой и профилями: ~/.profile, ~/.bashrc, системными файлами /etc/profile и т.п. Там же обычно «дописывается» PATH, выставляются LANG/LC_*, подключаются менеджеры версий (pyenv/nvm/rbenv), алиасы и функции.
Cron же стартует задания в минимальном окружении. Он не является интерактивной оболочкой и обычно не читает ваши .bashrc/.profile. Отсюда два практичных правила:
- в cronjob используйте абсолютные пути к бинарникам и файлам;
- если нужны переменные — задавайте их явно в crontab или подгружайте из отдельного env-файла.
Какие переменные обычно есть в окружении cron
Набор зависит от дистрибутива и cron-реализации, но чаще всего присутствуют:
SHELL(нередко/bin/sh);HOME(домашний каталог пользователя);LOGNAME/USER;PATH(обычно урезанный, иногда буквально/usr/bin:/bin).
Ключевое: этот PATH почти никогда не совпадает с вашим интерактивным.
PATH в cron: почему «command not found» — самая частая проблема
В интерактивной сессии PATH часто дополнен /usr/local/bin, путями менеджеров версий и пользовательскими каталогами. Cronjob же может запускаться с PATH, в котором нет даже /usr/sbin и /sbin (особенно если задача выполняется не от root).
Типовой симптом: в терминале работают python, node, composer, php, mysqldump, а в cron — «не найдено». Лучше сочетать два подхода:
- задайте
PATHв начале crontab; - используйте абсолютные пути к критичным бинарникам.
Как задать PATH и SHELL в crontab
В пользовательском crontab (редактируется командой crontab -e) можно задать переменные в «шапке»:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
MAILTO=
После этого все строки с расписанием будут выполняться с указанным PATH. Обратите внимание: SHELL по умолчанию может быть /bin/sh, а ваш скрипт может не быть совместимым с sh (например, использует " target="_blank">алерты на истечение SSL-сертификатов и продление.


