Как мне полностью замолчать cronjob для / dev / null /?

72

На моем Ubuntu-Desktop и на моем debian-сервере у меня есть скрипт, который нужно выполнять каждую минуту (скрипт, который вызывает тикет моего космического онлайн-браузера ).

Проблема в том, что на производных от Debian cron регистрируется при /var/log/syslogкаждом запуске. Я в конечном итоге видя повторил сообщение он был казнен снова и снова /var/log/syslog:

Nov 11 16:50:01 eclabs /USR/SBIN/CRON[31636]: (root) CMD (/usr/bin/w3m -no-cookie http://www.spacetrace.org/secret_script.php > /dev/null 2>&1)

Я знаю, что для подавления вывода программы я могу перенаправить его /dev/null, например, чтобы скрыть все сообщения об ошибках и предупреждения от программы, я могу создать строку в crontab следующим образом

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null

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


РЕДАКТИРОВАТЬ:
есть решение для перенаправления cron-журналов в отдельный журнал, как предложено здесь, путем изменения/etc/syslog.conf

Но недостаток в том, что тогда ВСЕ выходные данные всех cronjobs перенаправляются.

Можно ли как-то перенаправить только один cronjob в отдельный файл журнала? Желательно настраивается внутри самого cron.hourlyфайла.

rubo77
источник
2
Вы также можете просто поместить MAILTO=""в начало файла cron. Это будет подавлять все электронные письма. И я никогда не слышал о демоне cron, который отправляет вывод задания в системный журнал (но я думаю, что это возможно).
Патрик
@ Патрик - это отключит все, что может быть хорошо, но просто будьте в курсе. Смотрите мое обновление, вы можете установить несколько mAILTO.
SLM
Да, так MAILTO=""как 1-я строка crontab предотвратит любые электронные письма. Кроме того, используйте полную строку trifecta в командной строке, если вы подавляете все выходные данные. Все 3 вида перенаправляются этой строкой: >/dev/null 2>&1 - Конечно, вы можете сделать так, чтобы скрипт включал периодические записи в отдельный журнал.
SDsolar

Ответы:

119

Сделайте строку так:

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

Это захватит STDOUT (1) и STDERR (2) и отправит их в /dev/null.

MAILTO

Вы также можете отключить электронную почту, установив, а затем сбросив, MAILTO=""что приведет к отключению отправки любых электронных писем.

пример

MAILTO=""
* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

MAILTO="admin@somedom.com"
 * * * * *      root    /usr/local/sbin/myothercommand.sh

Дополнительный обмен сообщениями

Часто вы будете получать следующие типы сообщений в /var/log/syslog:

Nov 11 08:17:01 manny CRON[28381]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

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

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

SLM
источник
@ rubo77 - можешь показать пример? Мне нужно посмотреть, что не работает с этим. Googling превращает это в качестве ответа: cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command
ОДС
Это работает для всех выходных данных и электронных писем, но все равно генерирует строку для каждого вызова cron в / var / log / syslog
rubo77
@ rubo77 - это то, о чем я мог спросить. Вы не можете остановить эти сообщения, они генерируются самим демоном crond.
Slm
@ rubo77 - Я знаю /etc/syslog.conf, что меняюсь , вряд ли я бы посчитал это альтернативой. Это просто изменит файл, в который выгружаются журналы, или вы можете полностью отключить сообщения cron. Нет способа сделать то, что вы хотите.
SLM
1
@ rubo77 - единственный способ, которым вы сможете делать то, что вы хотите, если вы поставите grep -v ...после вызова crond.
SLM
10

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

Так как вы ничего сделать не кажется , чтобы остановить это, стоит задаться вопросом: что именно этот сценарий , и что именно это сообщение , которое вы видите в системном журнале?

Если предложение slm не сработало, то это потому, что что-то записывается в системный журнал напрямую - либо cron, как кажется из некоторых ваших комментариев, либо процесс, запускаемый cron. Сообщения, отправляемые в системный журнал, не приходят от stdin или stderr, поэтому 2>&1&>не помогут.

Может быть способ настроить поведение рассматриваемого приложения, за исключением того, что мы не знаем, что это такое.

Конечно, есть способ настроить большинство современных реализаций системного журнала (их несколько) для очень специфической фильтрации сообщений. Например, если в сообщении журнала используется уникальный тег, вы можете указать его. Но опять же, поскольку мы ничего не знаем о конкретном сообщении или о том, какой syslogd вы используете, то нет ничего конкретного, что можно было бы рекомендовать.

Моя общая мысль заключается в том, что если вы не хотите перенаправлять / фильтровать сообщения, потому что «это перенаправит все сообщения», то вы можете усовершенствовать технику фильтрации. В потоке сбоев сервера, на который вы ссылаетесь, упоминается только фильтрация по объекту ( *.cron), но вы можете настроить более специализированные фильтры, чем этот.


В Debian и Ubuntu есть доступный rsyslog . В Debian 5+ это системный журнал по умолчанию, в Ubuntu это опция, поэтому вам придется ее установить. Чтобы создать фильтр, предназначенный для определенного вида контента, поместите его в верхнюю часть (т. Е. Перед любыми другими правилами, но после общей конфигурации, загрузки модуля и т. Д.) /etc/rsyslog.conf. Лучший способ сделать это , чтобы не изменить rsyslog.confсебя, но создать файл в /etc/rsyslog.conf.d/директории с именем , начинающимся с двумя цифрами , которые меньше , чем 50, то есть /etc/rsyslog.conf.d/15-my-filter.conf. Вы можете поместить туда что-то вроде этого:

:msg, contains, "/usr/bin/w3m -no-cookie" /dev/null

Это отправит сообщение /dev/null(или отдельный журнал, если вы предпочитаете). Тем не менее, сообщение все равно будет проходить через последующие правила, которые отправляют его /var/log/syslog. Чтобы предотвратить это:

& stop

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

Вы должны перезагрузить компьютер rsyslogdпосле изменения конфигурации (например, в системах systemd systemctl restart rsyslog):

kill -HUP $(cat /var/run/rsyslogd.pid)

HUP заставляет демона перезапустить себя.

лютик золотистый
источник
For rsyslog ~теперь устарела и должна быть заменена на stop. Также позиция в rsyslogd.confфайле имеет значение. Так что для rsyslog я бы просто использовал :msg, contains, "/usr/bin/w3m -no-cookie" stop. А затем перезагрузите sudo systemctl restart rsyslog.
Фрэнк
4

+ Изменить /etc/default/cron

# Or, to log standard messages, plus jobs with exit status != 0:
# EXTRA_OPTS='-L 5'
#
# For quick reference, the currently available log levels are:
#   0   no logging (errors are logged regardless)
#   1   log start of jobs
#   2   log end of jobs
#   4   log jobs with exit status != 0
#   8   log the process identifier of child process (in all logs)
#
EXTRA_OPTS="-L 0"

По умолчанию EXTRA_OPTSстрока""

Даллас
источник
2

Перенаправление на /dev/nullскрывает вывод команды. Если вы этого не сделаете, то cron вышлет вам по почте. Вывод команды никогда не попадает в системные журналы (по крайней мере, из-за действий cron).

Обычно плохая идея перенаправлять вывод /dev/null, особенно вывод ошибок: если что-то пойдет не так, у вас не будет никакой информации для диагностики проблемы. Если вы не хотите получать почту, перенаправьте ее в файл журнала.

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

Если вы хотите пропустить некоторые задания, единственный вариант - применить текстовую фильтрацию к сообщениям журнала в демоне syslog. Де-факто стандартом для фильтрации syslog является запуск rsyslog (который может или не может быть по умолчанию в вашей системе) в качестве демона syslog. Смотрите ответ Златовласки о том, как отфильтровать эту конкретную команду.

Жиль "ТАК - перестань быть злым"
источник