Вывод электронной почты 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.

saraedum
источник
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
Жиль "ТАК - перестань быть злым"
источник