长时间运行的PHP CLI作业存活探针实现方案咨询
如何在无额外依赖下监控PHP批量处理脚本的存活状态(Docker/Kubernetes环境)
针对无服务暴露的PHP命令行批量脚本,可通过进程检测、心跳文件验证、日志内容校验三种核心方式实现监控,无需引入额外库或特性,适配Docker及Kubernetes环境:
Docker环境方案
1. 进程存在性健康检查
在Dockerfile中添加HEALTHCHECK指令,直接检测脚本进程是否存活:
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s \ CMD ps aux | grep [y]our_batch_script.php || exit 1
[y]的作用是避免grep自身被误匹配为目标进程start-period需根据脚本启动耗时调整,避免初始化阶段误判
2. 心跳文件健康检查
让脚本定期更新心跳文件,通过检查文件新鲜度判断脚本是否正常运行(比单纯进程检测更能识别僵死进程):
- 在PHP脚本中添加心跳逻辑:
// 每隔30秒更新心跳文件 while (true) { // 脚本核心处理逻辑... file_put_contents('/tmp/script_heartbeat', time()); sleep(30); }
- 在Dockerfile中配置健康检查:
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s \ CMD test $(($(date +%s) - $(stat -c %Y /tmp/script_heartbeat))) -lt 300 || exit 1
- 上述命令判断心跳文件是否在5分钟(300秒)内更新过,超时则判定异常
Kubernetes环境方案
利用Kubernetes的livenessProbe(存活探针)实现自动重启异常Pod,同样基于exec类型探针,无需HTTP/TCP端口:
1. 进程存活探针
在Deployment的Pod模板中配置:
livenessProbe: exec: command: - pgrep - -f - your_batch_script.php initialDelaySeconds: 60 periodSeconds: 30 failureThreshold: 2
pgrep -f会匹配包含脚本名的进程,返回0则正常,非0则触发Pod重启failureThreshold设置连续2次检测失败后重启
2. 心跳文件探针
结合脚本的心跳逻辑,配置探针检查文件新鲜度:
livenessProbe: exec: command: - sh - -c - "test $(($(date +%s) - $(stat -c %Y /tmp/script_heartbeat))) -lt 300" initialDelaySeconds: 60 periodSeconds: 30 failureThreshold: 2
3. 日志内容探针
如果脚本会定期输出正常运行的标识(如"Batch processed successfully"),可通过检查日志判断业务状态:
livenessProbe: exec: command: - sh - -c - "tail -n 100 /var/log/batch_script.log | grep -q 'Batch processed successfully'" initialDelaySeconds: 60 periodSeconds: 60 failureThreshold: 2
通用注意事项
- 心跳间隔和检测阈值需根据脚本的处理周期调整,避免误判
- 脚本需确保日志/心跳文件写入权限正常,避免因权限问题导致监控失效
- Kubernetes环境中,若脚本运行时间较长(超过Pod的
terminationGracePeriodSeconds),需调整该参数避免强制杀死进程
内容的提问来源于stack exchange,提问作者Jindra
相关产品推荐
相关产品推荐

