ThinkPHP 6 定时任务需通过结构化日志+外部工具实现监控告警:统一配置cron日志通道、显式记录启停与异常、用shell脚本扫描MISSING_END/ERROR/超时等失败信号,并加锁防并发、辅以文件标记和轻量可视化验证。

ThinkPHP 6 定时任务本身不内置监控告警能力,必须通过日志捕获 + 外部工具联动实现可观测性。核心思路是:让每个定时命令稳定输出结构化日志 → 持久化到独立文件或标准通道 → 用系统级工具(如logwatch、shell脚本或轻量监控服务)识别失败特征并触发通知。
统一日志规范:避免静默失败
CLI环境下默认日志门面可能丢内容,必须显式指定通道和格式:
- 在命令类的execute()开头添加Log::channel('cron')->info('[START] ' . date('Y-m-d H:i:s')),结尾加Log::channel('cron')->info('[END] ' . date('Y-m-d H:i:s'))
- 所有异常必须被捕获并记录完整堆栈:catch (\Exception $e) { Log::channel('cron')->error('Task failed: ' . $e->getMessage(), ['trace' => $e->getTraceAsString()]); }
- 配置config/log.php中'cron'通道:类型为single,路径设为runtime/log/cron/,启用max_files轮转(如30天)
失败识别:用 shell 脚本扫描关键信号
定时任务失败通常表现为:无结束日志、含ERROR字样、超时未完成。可写一个检查脚本/opt/check-cron.sh:
- 检查最近10分钟内是否有[END]日志行:grep -q "\[END\]" runtime/log/cron/*.log && exit 0 || echo "MISSING_END"
- 检查ERROR行数量是否突增:grep -c "ERROR" runtime/log/cron/$(date -d 'yesterday' +%Y%m%d).log,对比前日阈值
- 若发现异常,用mail -s "Cron Alert" admin@example.com 发邮件(需先配置sendmail或msmtp)
集成系统级告警:Crontab + 状态标记
把监控脚本也纳入Crontab,与业务任务错峰运行:
立即学习“PHP免费学习笔记(深入)”;
- 每5分钟检查一次:*/5 * * * * cd /var/www/myproject && /opt/check-cron.sh >> /var/log/cron-monitor.log 2>&1
- 为每个定时任务添加执行状态标记文件,例如touch runtime/cron/cron:test.last_run,监控脚本可判断该文件是否超过预期间隔未更新
- 避免多个监控脚本竞争,所有写操作加flock -n /tmp/cron-check.lock -c "..."防止并发冲突
轻量可视化:用 tail + grep 实时盯屏
开发或上线初期,快速验证可用性:
- 终端执行:tail -f runtime/log/cron/*.log | grep --line-buffered -E "(START|END|ERROR)",实时看到任务启停与错误
- 配合watch -n 30 "ls -lt runtime/log/cron/"确认日志文件是否持续生成,排除权限或磁盘满问题
- 若用Supervisor托管常驻任务,可通过supervisorctl status查进程存活状态,比日志更底层



















