根据退出状态将Cron电子邮件输出到MAILTO


11

我有一个cron作业,运行像这样的php命令:

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

这应该仅将STDERR输出发送到MAILTO地址。根据我的收集,即使退出状态为1,php脚本也不输出任何STDERR信息。

如何获得php命令(STDOUT)的输出,并且仅在退出状态为非零的情况下将其发送给MAILTO?

Answers:


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

它将标准输出转储到logfile脚本中,并且仅在脚本失败(退出非零)时才输出。

注意:如果脚本也可能输出到stderr,则应重定向stderrstdout。否则,stderr即使退出代码为0,打印到的任何内容也会导致cron发送电子邮件:

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

这也将解决stderr中出现的任何问题,这并不一定意味着存在错误(例如,调试输出)。
hoffmanc 2014年

3

您是否考虑过moreutils的慢性病。我认为它完全符合您的要求:

慢性运行命令,并安排其标准输出和标准错误仅在命令失败(退出非零或崩溃)时显示。如果命令成功执行,则任何多余的输出都将被隐藏。

在最近的版本中,-e如果已将任何内容写入stderr ,则会有一个开关来显示完整的输出。


2

由于输出是在知道退出状态之前生成的,因此您必须将其存储在某个位置。

一种可能性是将其存储在shell变量中:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.