Мне нужно, чтобы мои 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