Если я cron
неправильно настраиваю задания, они, по-видимому, перестают работать. Где мне искать журнал ошибок, чтобы понять, что пошло не так?
Если я cron
неправильно настраиваю задания, они, по-видимому, перестают работать. Где мне искать журнал ошибок, чтобы понять, что пошло не так?
Ответы:
Как уже отмечали другие, cron
отправит вам по электронной почте вывод любой программы, которую он запускает (если она есть). Итак, если вы не получите никакого вывода, в основном есть три возможности:
crond
не мог даже запустить оболочку для запуска программы или отправки электронной почтыcrond
были проблемы с отправкой по почте, или почта была потеряна.Случай 1. маловероятен, но что-то должно было быть записано в журналах cron. Cron имеет собственную зарезервированную функцию системного журнала, поэтому вам нужно посмотреть /etc/syslog.conf
(или эквивалентный файл в вашем дистрибутиве), чтобы увидеть, куда cron
отправляются сообщения этой службы . Популярные направления включают в себя /var/log/cron
, /var/log/messages
и /var/log/syslog
.
В случае 2. вы должны проверить журналы демона почтовой программы: сообщения от демона Cron обычно появляются как root@yourhost
. Вы можете использовать MAILTO=...
строку в файле crontab, чтобы cron отправлял электронную почту на определенный адрес, что должно облегчить поиск журналов демона почтовой программы. Например:
MAILTO=my.offsite.email@example.org
00 15 * * * echo "Just testing if crond sends email"
В случае 3. вы можете проверить, действительно ли программа была запущена, добавив другую команду, эффект которой вы можете легко проверить: например,
00 15 * * * /a/command; touch /tmp/a_command_has_run
так что вы можете проверить crond
, действительно ли что-то запускалось, посмотрев на mtime of /tmp/a_command_has_run
.
dead.letter
корневым или соответствующим домашним каталогом пользователя.
Вы всегда можете явно отправить выходные данные задания в файл журнала:
0 8 * * * /usr/local/bin/myjob > /var/log/myjob.log 2>&1
Имейте в виду, что это заменит почтовое поведение, которое было упомянуто ранее, потому что crond iself не будет получать никаких результатов от работы. Если вы хотите сохранить такое поведение, вам следует заглянуть в тройник (1).
>>
вместо >
, чтобы не перезаписывать файл журнала каждый раз?
| /usr/bin/logger
если вы пожелаете, как умно предложено Стефаном. Выбери свой яд: tldp.org/LDP/abs/html/io-redirection.html
myjob.log
с размером 0, как и ожидалось, но он вошел в другой файл, где я могу изменить этот параметр?
Если вы не видите почту, вы можете рассылать root @ yourcompany с ошибками, которые могут раздражать людей, которые используют эту учетную запись для мониторинга. Попробуйте вместо этого отправить вывод в Syslog:
*/5 * * * * yourcronjob 2>&1 | /usr/bin/logger -t yourtag
Затем дождитесь запуска cronjob и найдите ошибку в / var / log / messages (или /var/log/user.log в некоторых системах).
Это прекрасно работает для сообщений об ошибках длиной всего 1-2 строки, таких как «yourcronjob: команда не найдена». Он также использует вашу существующую инфраструктуру системного журнала (Logrotation, центральный системный журнал, Splunk и т. Д.). Он также уменьшает спам электронной почты до корня.
Это не может быть хорошим решением, если ваш cronjob генерирует сотни строк вывода.
Конфигурация cron по умолчанию отправит вам письмо с выводом вашей программы. Если это не удастся, вы можете попробовать обернуть вашу неудачную программу в сценарий оболочки, который гарантирует, что программа не выйдет из строя, и вы можете дополнительно записать результат.
Это настраиваемый параметр в некоторых реализациях cron.
Вы должны получать электронную почту, crond
когда задание либо не запускается, либо когда задание возвращает ненулевой код завершения. Попробуйте набрать:
$ mailx
в командной строке.
mailx(1)
является основной программой чтения почты в большинстве Unix-подобных систем. Он очень примитивен по современным стандартам, но вы всегда можете рассчитывать на его доступность. Другие, более качественные почтовые агенты могут быть доступны, но их достаточно, чтобы вы никогда не знали, какой из них установлен на какой-то случайной машине, которую вы используете.
Обратите внимание, что если вы не настроили свою систему в качестве сервера электронной почты в Интернете, эта почтовая подсистема используется только внутри компьютера. Вы можете отправлять электронную почту и получать от других пользователей на машине, но вы не сможете отправлять электронную почту по всему миру, и электронная почта из внешнего мира, безусловно, не сможет прийти на вашу машину.
Cron регистрирует основную информацию /var/log/messages
, но отправляет любые выходные данные программы вызывающему пользователю.
/var/log/messages
на моем сервере Ubuntu ( 4.4.0-128-generic #154-Ubuntu SMP
). Есть идеи почему? У меня было несколько заданий cron, определенных в root
crontab в течение нескольких месяцев (например apt autoremove
), но ни одна из них не была выполнена.
Я наткнулся на эту ветку несколько лет назад, испытывая те же проблемы, и совсем недавно натолкнулся на решение вышеупомянутых случаев Рикардо. Отсутствие электронной почты трудно обнаружить (как вы упомянули), и вы определенно не хотите спамить вашу электронную почту root @ yourcompany. Если интересно, проверьте deadmanssnitch.com. , Этот инструмент, кажется, решает вышеупомянутые случаи. Кажется довольно простым в использовании - просто добавьте немного кода, который инструмент дает вам в ваш cronjob. Если ваша работа не выполняется по указанному внутреннему, вы будете предупреждены. Если ваша работа начнет работать снова, вы также будете предупреждены.
Я использую vixie-cron
, поэтому я не знаю, относится ли это ко всему. Но у меня есть dead.letter
файл, который содержит весь вывод работы.
В моей /root/
папке я crons.cron
установил crontab, запустив crontab /root/crons.cron
. dead.letter
будет создан в /root/
.
Изменить
Я просто Google'd dead.letter
, и это недоставленная почта. Это никак не связано с cron. Если у вас не настроена почта (как у меня), у вас будет файл.
Для новичков это может быть болью для отладки. Обязательно не меняйте значения минут и часов. Сначала приходит минута, потом час. Когда вы предоставляете значения меньше 12 для каждого, он примет их, но может работать не так, как ожидалось, или вообще не работать.