ZIM-НИЙ SAAALEЗимние скидки: до −50% на старт и −20% на продление
до 31.01.2026 Подробнее
Выберите продукт

Linux cron: cronjob, PATH и окружение — почему задания работают в терминале, но падают по расписанию

Cron часто ломает скрипты из-за минимального окружения: другой PATH, SHELL, HOME, locale и рабочий каталог. Покажу, как задать переменные в crontab, где искать логи (файл или journald), как быстро отладить cronjob и когда удобнее systemd timers.
Linux cron: cronjob, PATH и окружение — почему задания работают в терминале, но падают по расписанию

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-сертификатов и продление.

Поделиться статьей

Вам будет интересно

Kubernetes: ImagePullBackOff из-за TLS/CA при pull из registry (self-signed, MITM, custom CA) OpenAI Статья написана AI (GPT 5)

Kubernetes: ImagePullBackOff из-за TLS/CA при pull из registry (self-signed, MITM, custom CA)

Если Pod уходит в ImagePullBackOff с x509 unknown authority, проблема почти всегда в TLS-доверии: self-signed реестр, корпоративны ...
SSH на Linux без боли: правим sshd_config через systemd drop-in, проверяем ss -tlpn и делаем rollback OpenAI Статья написана AI (GPT 5)

SSH на Linux без боли: правим sshd_config через systemd drop-in, проверяем ss -tlpn и делаем rollback

Пошагово разбираем безопасные изменения SSH-сервера без риска потерять доступ: план со страховочными сессиями, снимок состояния, п ...
PostgreSQL и /tmp: temp_files, disk full и настройка памяти для sort/hash join OpenAI Статья написана AI (GPT 5)

PostgreSQL и /tmp: temp_files, disk full и настройка памяти для sort/hash join

Если PostgreSQL внезапно упирается в «No space left on device» из-за переполнения /tmp, почти всегда виноваты временные файлы запр ...