Как войти в работу cron?

220

Я хочу знать, как я могу точно видеть, что задания cron делают при каждом выполнении. Где находятся файлы журналов? Или я могу отправить вывод на мою электронную почту? Я установил адрес электронной почты для отправки журнала при выполнении задания cron, но пока ничего не получил.

Адриан М.
источник

Ответы:

348
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

запишет весь вывод задания cron в /var/log/myjob.log

Вы можете использовать mailдля отправки электронных писем. Большинство систем отправляют необработанные cronвыходные данные по электронной почте пользователю root или соответствующему пользователю.

Spliffster
источник
79
Описание того, что значит 2>&1: stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21
Яманеко
5
в чем может быть проблема, если этот файл журнала никогда не создается?
зажим
10
FWIW, если вы хотите, чтобы stderrи stdoutв журнале, 2>&1после косвенного обращения должен прийти:myjob.sh >> /var/log/myjob.log 2>&1
Дэн Лекок
2
Как вставить YYYY-MM-DD_hh-mm-secв выходной файл имя, чтобы каждое имя файла отличалось и сохранялось без перезаписи?
Даниэль
7
@Danijel serverfault.com/a/117365/193377 0 0 * * * /some/path/to/a/file.php> $ HOME / date +\%Y\%m\%d\%H\%M\%S-cron.log 2> & 1
AnneTheAgile
61

По умолчанию cron регистрирует в / var / log / syslog, чтобы вы могли видеть записи, связанные с cron, используя:

grep CRON /var/log/syslog

/ubuntu/56683/where-is-the-cron-crontab-log

Мэтью Лок
источник
2
В Ubuntu 12.04 по умолчанию используется без .log, т.е. / var / log / syslog
tishma
5
использовать journalctl | grep cronв системных системах
Microsoft Linux TM
2
/var/log/cronна AWS Linux AMI.
Джонатан
2
илиsudo journalctl -u cron
Джанфранко П.
2
Где именно cronрегистрируется, очень зависит от системы. Есть отдельный ответ с подробностями о том, как настраиваются различные места назначения журналирования в системах Linux (или, точнее, в системах, которые используют syslog). Другие системы могут иметь другой способ настройки этих вещей.
tripleee
10

Вот мой код:

* * * * * your_script_fullpath >> your_log_path 2>&1
Haimei
источник
«>>» означает добавить данные в файл? что означает "2> & 1", полный вывод с ошибкой, верно?
Nullpointer
3
Основные вопросы перенаправления лучше всего проверить в руководстве. Здесь также есть метрическая схема повторяющихся вопросов об этих операторах здесь, на переполнении стека. Но да, примерно; >>добавляет и 2>&1говорит отправить стандартную ошибку в то же место, что и стандартный вывод.
трипл
10

Существует как минимум три различных типа регистрации:

  1. Ведение журнала ДО выполнения программы, которое регистрирует только ЕСЛИ cronjob TRIED для выполнения команды. Этот файл находится в / var / log / syslog, как уже упоминалось @Matthew Lock.

  2. Регистрация ошибок ПОСЛЕ выполнения программы, которую можно отправить по электронной почте или в файл, как указано @Spliffster. Я предпочитаю вход в файл, потому что с электронной почтой ТОГДА у вас НОВЫЙ источник проблем, и он проверяет, работает ли отправка и прием электронной почты безупречно. Иногда это так, иногда нет. Например, на простом обычном настольном компьютере, в котором вы не заинтересованы в настройке smtp, иногда вы предпочитаете входить в файл:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • Я также рассмотрел бы проверку разрешений / ABSOLUTE_PATH_TO_LOG и запускал команду из разрешений этого пользователя. Только для проверки, пока вы проверяете, может ли это быть потенциальным источником проблем.
  3. Ведение журнала самой программы с собственной обработкой ошибок и ведением журнала для целей отслеживания.

Есть несколько распространенных источников проблем с cronjobs: * ABSOLUTE PATH исполняемого файла. Когда вы запускаете его из своей оболочки, он может работать, но процесс cron, похоже, использует другую среду, и, следовательно, он не всегда находит двоичные файлы, если вы не используете абсолютный путь. * БИБЛИОТЕКИ, используемые двоичным файлом. Это более или менее аналогично предыдущему пункту, но убедитесь, что, если просто указать имя команды, то оно относится именно к двоичному файлу, который использует ту же библиотеку, или, что лучше, проверить, что двоичный файл, на который вы ссылаетесь, использует абсолютный путь это то же самое, что вы упоминаете, когда вы используете консоль напрямую. Двоичные файлы можно найти с помощью команды locate, например:

$locate python

Убедитесь, что двоичный файл, на который вы будете ссылаться, является тем же самым двоичным файлом, который вы вызываете в своей оболочке, или просто протестируйте снова в своей оболочке, используя абсолютный путь, который вы планируете ввести в cronjob.

  • Другим распространенным источником проблем является синтаксис в cronjob. Помните, что есть специальные символы, которые можно использовать для списков (запятых), для определения диапазонов (тире -), для определения приращения диапазонов (косых черт) и т. Д. Посмотрите: http://www.softpanorama.org/Utilities/ cron.shtml
Дэвид Л
источник
8

В Ubuntu вы можете включить cron.log файл, содержащий только записи CRON.

Раскомментируйте строку, которая упоминается cronв /etc/rsyslog.d/50-default.confфайле:

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

Сохраните и закройте файл, а затем перезапустите rsyslogслужбу:

sudo systemctl restart rsyslog

Теперь вы можете увидеть записи журнала cron в своем собственном файле:

sudo tail -f /var/log/cron.log

Пример выходов:

Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

Тем не менее, вы не увидите больше информации о том, какие сценарии были на самом деле запущены /etc/cron.dailyили внутри /etc/cron.hourly, если эти сценарии не перенаправят вывод в cron.log (или, возможно, в какой-либо другой файл журнала).

Если вы хотите проверить, работает ли crontab и не нужно искать его в cron.logили syslog, создайте crontab, который перенаправляет вывод в файл журнала по вашему выбору - что-то вроде:

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

Шаги, взятые из: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/

Джанфранко П.
источник
Ubuntu 16.04 не показывал никаких журналов cron, и эта информация сделала свое дело.
Пойдя
5

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

Вы можете использовать MAILTO=recipientвcrontab файле, чтобы электронные письма отправлялись на другую учетную запись.

Чтобы это работало, вам нужно, чтобы почта работала правильно. Доставка в локальный почтовый ящик обычно не является проблемой (на самом деле, шансыls -l "$MAIL" что вы обнаружите, что вы уже получили некоторые), но чтобы получить его из коробки и выйти в Интернет, требуется MTA (Postfix, Sendmail, что у вас) быть правильно настроенным для подключения к миру.

Если нет вывода, электронное письмо не будет сгенерировано.

Распространенным условием является перенаправление вывода в файл, и в этом случае, конечно, демон cron не увидит, что задание вернет какой-либо вывод. Один из вариантов - перенаправить стандартный вывод в файл (или написать сценарий, чтобы он никогда ничего не печатал - возможно, он вместо этого сохраняет результаты в базе данных или выполняет задачи обслуживания, которые просто ничего не выводят?) И получает электронное письмо только при наличии это сообщение об ошибке

Чтобы перенаправить оба выходных потока, синтаксис

42 17 * * * script >>stdout.log 2>>stderr.log

Обратите внимание на то, как мы добавляем (удваиваем >>) вместо перезаписи, чтобы вывод любого предыдущего задания не заменялся выводом следующего.

Как предлагается во многих ответах, вы можете отправить оба выходных потока в один файл; замените второе перенаправление 2>&1на «стандартная ошибка должна идти везде, где идет стандартный вывод». (Но я не особо одобряю эту практику. Это в основном имеет смысл, если вы ничего не ожидаете от стандартного вывода, но, возможно, что-то упустили, возможно, из внешнего инструмента, который вызывается из вашего скрипта.)

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

Обычным антипаттерном является перенаправление всего /dev/null(а затем запросить переполнение стека, чтобы помочь вам выяснить, что пошло не так, когда что-то не работает; но мы также не можем увидеть потерянный вывод!)

Внутри вашего скрипта убедитесь, что регулярный вывод (фактические результаты, в идеале в машиночитаемой форме) и диагностика (обычно отформатированные для читателя-человека) разделены. В сценарии оболочки

echo "$results"  # regular results go to stdout
echo "$0: something went wrong" >&2

Некоторые платформы (например, GNU Awk) позволяют использовать имя файла /dev/stderrдля сообщений об ошибках, но это не всегда переносимо; в Perl warnи dieпечатать со стандартной ошибкой; в Python пишите sys.stderrили используйте logging; в Ruby попробуй $stderr.puts. Обратите также внимание на то, как сообщения об ошибках должны включать имя сценария, который выдал диагностическое сообщение.

tripleee
источник
1

Если вы запускаете какую-то команду с помощью sudo, она этого не допустит. Судо нужен Tty.

Саад Масуд
источник
4
Это также зависит от sudoконфигурации. Вещи, которые должны работать без указания пароля, должны быть настроены NOPASSWD:в вашей sudoersконфигурации.
tripleee
0

Если вы все еще хотите проверить свои задания cron, вы должны предоставить действующую учетную запись электронной почты при настройке заданий Cron в cPanel.

Когда вы укажете действительный адрес электронной почты, вы получите вывод выполненного задания cron. Таким образом, вы сможете проверить это и убедиться, что все было выполнено правильно. Обратите внимание, что вы не получите электронное письмо, если нет результатов команды cron job.

Пожалуйста, имейте в виду, что вы получите электронное письмо для каждого из выполненных заданий cron. Это может затопить ваш почтовый ящик в случае, если ваши кроны бегут слишком часто

Фаридул Хан
источник