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

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

我有一个 cron 作业运行如下 php 命令:

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

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

如何获取 php 命令的输出(STDOUT)并仅在退出状态非零时将其发送到 MAILTO?

答案1

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

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

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

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

答案2

你有没有考虑过慢性的更多实用程序。我认为它正是你想要的:

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

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

答案3

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

一种可能性是将其存储在 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

相关内容