На моем 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
файла.
источник
MAILTO=""
в начало файла cron. Это будет подавлять все электронные письма. И я никогда не слышал о демоне cron, который отправляет вывод задания в системный журнал (но я думаю, что это возможно).MAILTO=""
как 1-я строка crontab предотвратит любые электронные письма. Кроме того, используйте полную строку trifecta в командной строке, если вы подавляете все выходные данные. Все 3 вида перенаправляются этой строкой:>/dev/null 2>&1
- Конечно, вы можете сделать так, чтобы скрипт включал периодические записи в отдельный журнал.Ответы:
Сделайте строку так:
Это захватит STDOUT (1) и STDERR (2) и отправит их в
/dev/null
.MAILTO
Вы также можете отключить электронную почту, установив, а затем сбросив,
MAILTO=""
что приведет к отключению отправки любых электронных писем.пример
Дополнительный обмен сообщениями
Часто вы будете получать следующие типы сообщений в
/var/log/syslog
:Это просто уведомления через cron о том, что каталог cronjobs был выполнен. Это сообщение не имеет ничего общего с этими заданиями, оно приходит
crond
напрямую от демона. На самом деле вы ничего не можете с этим поделать, и я бы посоветовал вам не отключать их, поскольку они, вероятно, являются единственным окном, в которое вы заходитеcrond
через логи.Если они очень раздражают вас, вы всегда можете направить их в альтернативный файл журнала, чтобы получить их из вашего
/var/log/syslog
файла, через/etc/syslog.conf
файл конфигурации дляsyslog
.источник
/etc/syslog.conf
, что меняюсь , вряд ли я бы посчитал это альтернативой. Это просто изменит файл, в который выгружаются журналы, или вы можете полностью отключить сообщения cron. Нет способа сделать то, что вы хотите.grep -v ...
после вызоваcrond
.Так как вы ничего сделать не кажется , чтобы остановить это, стоит задаться вопросом: что именно этот сценарий , и что именно это сообщение , которое вы видите в системном журнале?
Если предложение 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
. Вы можете поместить туда что-то вроде этого:Это отправит сообщение
/dev/null
(или отдельный журнал, если вы предпочитаете). Тем не менее, сообщение все равно будет проходить через последующие правила, которые отправляют его/var/log/syslog
. Чтобы предотвратить это:Сразу после этой другой линии. Это отбрасывает все, что соответствует предыдущему правилу. Или, для однострочных правил, вы можете просто добавить
stop
в конец этой строки правил.Вы должны перезагрузить компьютер
rsyslogd
после изменения конфигурации (например, в системах systemdsystemctl restart rsyslog
):HUP заставляет демона перезапустить себя.
источник
~
теперь устарела и должна быть заменена наstop
. Также позиция вrsyslogd.conf
файле имеет значение. Так что для rsyslog я бы просто использовал:msg, contains, "/usr/bin/w3m -no-cookie" stop
. А затем перезагрузитеsudo systemctl restart rsyslog
.+ Изменить
/etc/default/cron
По умолчанию
EXTRA_OPTS
строка""
источник
Перенаправление на
/dev/null
скрывает вывод команды. Если вы этого не сделаете, то cron вышлет вам по почте. Вывод команды никогда не попадает в системные журналы (по крайней мере, из-за действий cron).Обычно плохая идея перенаправлять вывод
/dev/null
, особенно вывод ошибок: если что-то пойдет не так, у вас не будет никакой информации для диагностики проблемы. Если вы не хотите получать почту, перенаправьте ее в файл журнала.Однако все это не имеет отношения к вашей проблеме. Сообщение, которое вы цитируете, получено от самого cron. Cron записывает запись в журнал каждый раз, когда запускает задание. Ни одна из реализаций cron, которую я видел, не позволяет вам использовать разные конфигурации журналирования для разных заданий.
Если вы хотите пропустить некоторые задания, единственный вариант - применить текстовую фильтрацию к сообщениям журнала в демоне syslog. Де-факто стандартом для фильтрации syslog является запуск rsyslog (который может или не может быть по умолчанию в вашей системе) в качестве демона syslog. Смотрите ответ Златовласки о том, как отфильтровать эту конкретную команду.
источник