Як я повністю замовчую cronjob to / dev / null /?


72

У моєму Ubuntu-Desktop та на моєму сервері 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, тому він не генерує жодних повідомлень у syslog та не створює ніяких електронних листів


EDIT:
існує рішення перенаправити cron-журнали в окремий журнал, як запропоновано тут , змінивши/etc/syslog.conf

Але недолік полягає в тому, що тоді ВСІ вихідні дані з усіх кронівок переспрямовуються.

Чи можу я якось лише переспрямувати одну cronjob на окремий файл журналу? Переважно налаштовується всередині самого cron.hourlyфайлу.


2
Ви також можете просто поставити MAILTO=""на початку файл cron. Це придушить усі електронні листи. І я ніколи не чув про демона cron, який надсилає вихідну роботу в syslog (але, мабуть, це можливо).
Патрік

@Patrick - це відключить усе, що може бути нормально, але просто слід знати. Дивіться моє оновлення, ви можете встановити кілька 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=""
* * * * *       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.


@ rubo77 - ти можеш показати приклад? Мені потрібно подивитися, що з цим не працює. Гуглінг підкреслює це як відповідь: cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command
slm

Це працює для всіх вихідних та електронних листів, але він все ще генерує лінію для кожного виклику cron в / var / log / syslog
rubo77

@ rubo77 - ось що я думав, що ти можеш запитати. Ви не можете зупинити ці повідомлення, вони генеруються самим демоном врожаю.
slm

@ rubo77 - Я знаю про зміни /etc/syslog.conf, я навряд чи вважаю це альтернативою. Це просто змінить файл, в який потрапляють журнали, або ви можете повністю відключити повідомлення cron разом. Не існує способу робити те, що ти хочеш.
slm

1
@ rubo77 - єдиний спосіб, коли ти зможеш робити те, що ти хочеш, - це якщо ти введеш grep -v ...після виклику crond.
slm

10

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

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

Якщо пропозиція slm не спрацьовує, це тому, що щось входить безпосередньо в syslog - або cron, як здається, мається на увазі в деяких ваших коментарях, або в іншому випадку, керований cron. Повідомлення, надіслані до syslog, не надходять із stdin чи stderr, тому 2>&1&>не допоможуть.

Можливо, є спосіб налаштувати поведінку відповідної програми, за винятком того, що ми не знаємо, що це таке.

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

Моя загальна думка полягає в тому, що якщо ви не хочете перенаправляти / фільтрувати повідомлення, оскільки "це переспрямує всі повідомлення", ви можете вдосконалити техніку фільтрації. Нитка помилок сервера, яку ви зв'язали, просто згадує про фільтрування по об'єкту ( *.cron) - але ви можете налаштувати більш спеціалізовані фільтри, ніж це.


У Debian і Ubuntu доступний rsyslog . У debian 5+ це syslog за замовчуванням, в 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після зміни конфігурації (наприклад, на системних системах systemctl restart rsyslog):

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

HUP змушує демон перезапустити себе.


Зараз 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 пише запис у журнал кожного разу, коли він виконує завдання. Жодна реалізація хронів, яку я бачив, не дозволяє використовувати різні конфігурації журналу для різних завдань.

Якщо ви хочете опустити деякі завдання, ваш єдиний варіант - застосувати фільтрацію тексту до повідомлень журналу в демон-syslog. Фактичним стандартом для фільтрації в syslog є запуск rsyslog (який може бути, а може і не бути типовим у вашій системі) як демон syslog. Дивіться відповідь goldilocks про те, як відфільтрувати цю конкретну команду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.