#Когда возникает ошибка в Debian и какие условия важны
Команда Debian работает в обычной оболочке, но та же строка из пользовательского crontab завершается ошибкой или не создаёт ожидаемый файл. Cron выполняет задания по своему расписанию и с сокращённым окружением; обычный профиль bash не является частью запуска по умолчанию.
#Причины и как отличить их друг от друга
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Команда не видна в PATH cron | В журнале либо локальной почте ошибка command not found. | Задать абсолютный путь к программе в задании. |
| Рабочий каталог и переменные отличаются | Скрипт ищет относительный файл или использует виртуальную среду. | Указать конкретный каталог и окружение в скрипте. |
| Запуск происходит под другим пользователем | Доступ к данным или секрету есть только у владельца интерактивного сеанса. | Сопоставить владельца crontab, права и целевой файл. |
#Пошаговая диагностика и устранение
- 1. Проверьте владельца и место расписанияВ терминале Debian выполните id и crontab -l. Если вывод говорит no crontab for user, возможно, нужное задание находится в /etc/crontab или в /etc/cron.d: там есть дополнительное поле пользователя, которого нет в crontab -e. Не редактируйте расписания соседних учётных записей.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
idcrontab -lsystemctl status cron --no-pager
- 2. Сверьте часы, расписание и факт запускаПроверьте date и timedatectl. В записи cron пять полей времени, за которыми идёт команда; правила дня месяца и дня недели могут срабатывать по ИЛИ. Если сервер спал или был выключен, обычный cron не обязан запускать пропущенные события после включения.Linux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
datetimedatectljournalctl -u cron -b --no-pager -n 90
- 3. Получите абсолютный путь программы и входных файловВ интерактивной оболочке выполните command -v и pwd, подставив имя исполняемой программы. Для Python с виртуальным окружением абсолютный путь обычно ведёт к конкретному python в каталоге проекта. Не используйте в расписании сокращения ~ и относительные пути без точного понимания HOME и cwd.Linux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
command -v ИМЯ_КОМАНДЫpwdprintf "%s\n" "$PATH"
- 4. Проверьте минимальное окружение без запуска опасной работыДля безопасной проверки собственного сценария откройте терминал под пользователем задания и запустите env -i с HOME и PATH, затем в отдельном тестовом сценарии только чтение. Если рабочий скрипт отправляет платежи, письма или меняет базу, повторно запускать его вручную нельзя.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
env -i HOME="$HOME" PATH=/usr/bin:/bin /usr/bin/env
- 5. Зафиксируйте исходный crontab перед исправлениемСохраните текущие строки расписания в файл внутри домашней папки, затем выполните crontab -e. В нужной строке укажите абсолютный путь к интерпретатору и самому скрипту, а также каталог в оболочке скрипта. Не меняйте частоту задачи одновременно с отладкой, чтобы не запустить её лишний раз.Linux · Терминал (Bash)С осторожностьюРедактирование меняет расписание последующих запусков.
crontab -l > "$HOME/crontab.backup-whelp"crontab -eКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 6. Организуйте ограниченный журнал ошибокДля одного собственного задания временно направьте stderr в приватный файл, созданный с правами владельца. Cron может отправлять вывод на локальную почту, которой на минимальном Debian нет, поэтому отсутствие писем не равно отсутствию выполнения. Не записывайте в журнал пароли или токены.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
umask 077touch "$HOME/cron-debug-whelp.log"
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
crontab -ljournalctl -u cron -b --no-pager -n 70ls -l "$HOME/cron-debug-whelp.log" - 7. Дождитесь следующего запуска и проверьте результатСверьте время в журнале cron и в файле диагностики, проверьте реальный выходной файл и его владельца. Если скрипт не запускался, вновь проверьте расписание; если запускался и упал, изучите конкретную ошибку вместо произвольного назначения прав. После успеха удалите временное журналирование секретных данных.
#Проверка результата и действия при неуспехе
Исправление подтверждается запуском точно по расписанию от правильного пользователя и получением ожидаемого результата, а не одной строкой успешного запуска cron.