Назад | Перейти на главную страницу

Crontab stderr в файл и по электронной почте

Мне нужно, чтобы мои cronjobs продолжали выводить ошибки в некоторых файлах, но я также хочу, чтобы они одновременно отправлялись по электронной почте. Кажется, это невозможно без некоторых уловок.

я нашел этот но мне не помогло.

Каким будет самый простой способ сделать это?

Если я правильно понял ваш вопрос, вы хотите отправлять ошибки (не выводить данные) в файл журнала, а также отправлять их по электронной почте.

Для этого используйте комбинацию tee и перенаправление stdout / stderr.

Согласно cron (8) manpage, cron может обработать электронную почту за вас. Нет необходимости дублировать эти усилия без нужды.

При выполнении команд все выходные данные отправляются владельцу crontab (или пользователю, указанному в переменной среды MAILTO в crontab, если таковой существует).

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

Предположим, что мой сценарий выполняет следующую команду. ls tmp/foo успешно, поэтому этот вывод переходит в STDOUT. ls tmp/bar генерирует ошибку, поэтому этот вывод отправляется в STDERR.

$ ls tmp/foo tmp/bar
ls: tmp/bar: No such file or directory
tmp/foo

Следующее задание cron скроет любой STDOUT, но перенаправит STDERR в /var/log/test.log

* * * * * ls tmp/foo tmp/bar 2>&1 >/dev/null | tee -a $HOME/var/log/test.log

Вот результаты. Электронная почта и ~ / var / log / test.log говорят об одном и том же.

В теле письма говорится:

ls: tmp/bar: No such file or directory

То же самое и в файле журнала:

$ cat ~/var/log/test.log
ls: tmp/bar: No such file or directory

В качестве дополнительного бонуса также можно отправлять STDERR и STDOUT в файл журнала (который вы просматриваете только изредка), но отправлять STDERR на экран (если запускается вручную) или по электронной почте (если запускается из cron). Я использую следующий фрагмент для долго работающих сценариев сборки.

{ { ./configure && make && make install ; } >> $LOGFILE ; } 2>&1 | tee -a $LOGFILE

Использовать tee:

MBPro-ABustardo:~ abustardo$ echo foo |tee tmp  
foo

MBPro-ABustardo:~ abustardo$ cat tmp  
foo

в твоем случае:

[your script] 2>&1 |tee [some local local file] |mail -s [subject] foo@example.com

Отвечает ли это на ваш вопрос? https://stackoverflow.com/questions/1396506/cron-send-email-with-stderr-but-not-stdout

Cron должен отправлять электронное письмо после каждого запуска, если не указано /dev/null