我有一个 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
那么你应该重定向stderr
到stdout
.否则,即使退出代码为 0,打印到的任何内容stderr
都会导致 cron 发送电子邮件:
php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile
答案2
答案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