Вывод электронной почты cron на MAILTO в зависимости от статуса выхода


11

У меня есть задание cron, которое запускает команду php:

php /path/to/script.php > dev/null

Это должно отправить только вывод STDERR на адрес MAILTO. Из того, что я собираю, скрипт php не выводит никакой информации STDERR, даже если его состояние выхода равно 1.

Как я могу получить выходные данные команды php (STDOUT) и отправить ее только в MAILTO, если состояние выхода не равно нулю?

Ответы:


12
php /path/to/script.php > logfile || cat logfile; rm logfile

который сбрасывает стандартный вывод в logfileи выводит его только в случае сбоя скрипта (выход не из нуля).

Примечание: если ваш скрипт также может выводить в, stderrвы должны перенаправить stderrна stdout. В противном случае все, что stderrбудет напечатано , заставит cron отправить электронное письмо, даже если код выхода равен 0:

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile

Это также исключит все, что появляется в stderr, что не обязательно означает, что есть ошибка (например, вывод отладки).
Хоффман

3

Считали ли вы хроническим от moreutils . Я думаю, что это именно то, что вы хотите:

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

В последних версиях есть -eпереключатель, который также показывает полный вывод, если что-то было записано в stderr.


2

Поскольку выходные данные генерируются до того, как станет известен статус выхода, вам придется их где-то хранить.

Одна возможность - сохранить его в переменной оболочки:

output=$(php /path/to/script.php)
if [ $? -ne 0 ]; then
  printf "%s\n" "$output"
fi

Это не полностью сохраняет вывод скрипта (он удаляет завершающие пустые строки), но это нормально для этого варианта использования. Если вы хотите сохранить конечные пустые строки:

output=$(php /path/to/script.php; ret=$?; echo a; exit $ret)
if [ $? -ne 0 ]; then
  printf "%s" "${output%a}"
fi

Если есть много информации, вы можете вместо этого сохранить ее во временном файле:

output_file=$(mktemp /var/tmp/script.XXXXXXXXXX.out)
php /path/to/script.php >>"$output_file"
ret=$?
if [ $ret -ne 0 ]; then
  echo "script.php failed (status $ret), see the output in $output_file"
fi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.