Где регистрируются ошибки cron?

170

Если я cronнеправильно настраиваю задания, они, по-видимому, перестают работать. Где мне искать журнал ошибок, чтобы понять, что пошло не так?

Брайан Литтл
источник

Ответы:

106

Как уже отмечали другие, cronотправит вам по электронной почте вывод любой программы, которую он запускает (если она есть). Итак, если вы не получите никакого вывода, в основном есть три возможности:

  1. crond не мог даже запустить оболочку для запуска программы или отправки электронной почты
  2. crond были проблемы с отправкой по почте, или почта была потеряна.
  3. программа не выдает никаких выходных данных (включая сообщения об ошибках)

Случай 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.

Риккардо Мурри
источник
3
Эти "электронные письма" также входят в файл? Я использую общий веб-хостинг и не думаю, что они будут знать, где мне написать.
Натан Лонг
3
Я благодарен за совет в случае 3, чтобы проверить, выполняется ли команда. В моем случае cron не выполнял мою работу, потому что я недавно изменил часовой пояс сервера и должен был перезапустить сервер cron, чтобы он мог оценить время cron в правильном часовом поясе.
Натан
1
В зависимости от вашего агента пересылки почты вы можете также найти недоставленные письма в файле, который называется dead.letterкорневым или соответствующим домашним каталогом пользователя.
Дарио Сеидл
43

Вы всегда можете явно отправить выходные данные задания в файл журнала:

0 8 * * * /usr/local/bin/myjob > /var/log/myjob.log 2>&1

Имейте в виду, что это заменит почтовое поведение, которое было упомянуто ранее, потому что crond iself не будет получать никаких результатов от работы. Если вы хотите сохранить такое поведение, вам следует заглянуть в тройник (1).

codehead
источник
9
Почему бы не использовать >>вместо >, чтобы не перезаписывать файл журнала каждый раз?
Крис
Конечно! Любой вид перенаправления ввода / вывода подойдет, даже | /usr/bin/loggerесли вы пожелаете, как умно предложено Стефаном. Выбери свой яд: tldp.org/LDP/abs/html/io-redirection.html
кодовый заголовок
Cron создал этот файл журнала myjob.logс размером 0, как и ожидалось, но он вошел в другой файл, где я могу изменить этот параметр?
Бухгалтер م
42

Если вы не видите почту, вы можете рассылать 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 генерирует сотни строк вывода.

Стефан Ласевский
источник
8

Конфигурация cron по умолчанию отправит вам письмо с выводом вашей программы. Если это не удастся, вы можете попробовать обернуть вашу неудачную программу в сценарий оболочки, который гарантирует, что программа не выйдет из строя, и вы можете дополнительно записать результат.

Это настраиваемый параметр в некоторых реализациях cron.

miguel.de.icaza
источник
7

Вы должны получать электронную почту, crondкогда задание либо не запускается, либо когда задание возвращает ненулевой код завершения. Попробуйте набрать:

$ mailx

в командной строке.

mailx(1)является основной программой чтения почты в большинстве Unix-подобных систем. Он очень примитивен по современным стандартам, но вы всегда можете рассчитывать на его доступность. Другие, более качественные почтовые агенты могут быть доступны, но их достаточно, чтобы вы никогда не знали, какой из них установлен на какой-то случайной машине, которую вы используете.

Обратите внимание, что если вы не настроили свою систему в качестве сервера электронной почты в Интернете, эта почтовая подсистема используется только внутри компьютера. Вы можете отправлять электронную почту и получать от других пользователей на машине, но вы не сможете отправлять электронную почту по всему миру, и электронная почта из внешнего мира, безусловно, не сможет прийти на вашу машину.

Уоррен Янг
источник
5

Cron регистрирует основную информацию /var/log/messages, но отправляет любые выходные данные программы вызывающему пользователю.

Hemant
источник
Там нет /var/log/messagesна моем сервере Ubuntu ( 4.4.0-128-generic #154-Ubuntu SMP). Есть идеи почему? У меня было несколько заданий cron, определенных в rootcrontab в течение нескольких месяцев (например apt autoremove), но ни одна из них не была выполнена.
Дан Даскалеску
2

Я наткнулся на эту ветку несколько лет назад, испытывая те же проблемы, и совсем недавно натолкнулся на решение вышеупомянутых случаев Рикардо. Отсутствие электронной почты трудно обнаружить (как вы упомянули), и вы определенно не хотите спамить вашу электронную почту root @ yourcompany. Если интересно, проверьте deadmanssnitch.com. , Этот инструмент, кажется, решает вышеупомянутые случаи. Кажется довольно простым в использовании - просто добавьте немного кода, который инструмент дает вам в ваш cronjob. Если ваша работа не выполняется по указанному внутреннему, вы будете предупреждены. Если ваша работа начнет работать снова, вы также будете предупреждены.

ss_jt
источник
1

Я использую vixie-cron, поэтому я не знаю, относится ли это ко всему. Но у меня есть dead.letterфайл, который содержит весь вывод работы.

В моей /root/папке я crons.cronустановил crontab, запустив crontab /root/crons.cron. dead.letterбудет создан в /root/.

Изменить Я просто Google'd dead.letter, и это недоставленная почта. Это никак не связано с cron. Если у вас не настроена почта (как у меня), у вас будет файл.

jonescb
источник
0

Для новичков это может быть болью для отладки. Обязательно не меняйте значения минут и часов. Сначала приходит минута, потом час. Когда вы предоставляете значения меньше 12 для каждого, он примет их, но может работать не так, как ожидалось, или вообще не работать.

Майкл Войо
источник
2
Вы правы, но я не уверен, что это действительно отвечает на вопрос.
Ройма