如何配置Cron仅在PHP脚本出错时发送系统收件箱通知?
解决Cron仅在PHP脚本出错时发送通知的方案
这个问题其实很好解决,核心就是利用Cron的邮件触发逻辑——只有当脚本产生标准错误(stderr)或者非零退出状态码时,才让Cron发送通知。下面给你两种靠谱的实现方式:
方案一:重定向标准输出,保留错误输出
这是最直接的方法,只需要修改Cron命令,把正常输出丢进黑洞,只留错误输出让Cron捕获:
*/2 * * * * php /path/to/your/script.php > /dev/null
原理说明:
> /dev/null会把脚本的标准输出(stdout)(也就是正常执行时的日志内容)重定向到系统黑洞,不会被Cron收集- 脚本的标准错误(stderr)(PHP的报错、警告等)会默认保留,当有错误产生时,Cron会自动把这些错误信息发送到你的系统收件箱
额外补充:
如果你的PHP配置默认把错误输出到stdout(比如某些自定义环境),可以强制让PHP把错误发送到stderr,命令改成:
*/2 * * * * php -d error_log=php://stderr /path/to/your/script.php > /dev/null
或者直接在PHP脚本开头添加一行配置:
ini_set('error_log', 'php://stderr');
方案二:基于退出状态码控制输出
这种方法更灵活,适合需要捕获"出错时的所有输出"的场景,前提是你的PHP脚本能正确返回退出状态码:
*/2 * * * * output=$(php /path/to/your/script.php); if [ $? -ne 0 ]; then echo "$output"; fi
原理说明:
output=$(...)先捕获脚本的所有输出(包括stdout和stderr)$?是上一条命令的退出状态码,-ne 0表示"不等于0"(即脚本执行出错)- 只有当脚本出错时,才会把捕获到的输出打印出来,Cron会收集这些内容并发送邮件
额外补充:
如果你的PHP脚本还没设置退出状态码,可以在代码里手动添加:
// 脚本正常执行完成时返回0 exit(0); // 脚本出错时返回非0值(比如1) exit(1);
总结
- 方案一最简单,适合绝大多数常规场景,不需要修改PHP代码
- 方案二更灵活,能捕获出错时的完整输出,但需要脚本配合设置退出码
内容的提问来源于stack exchange,提问作者Patoshi パトシ
相关产品推荐
相关产品推荐

