Debian服务器PHP-CLI定时任务无日志随机崩溃排查求助
排查PHP Cron任务无日志崩溃的方法
1. 捕获Cron任务的所有输出
Cron默认会丢弃标准错误输出,先修改crontab中的任务行,强制将所有输出(stdout/stderr)写入日志文件:
* * * * * /usr/bin/php /path/to/your/script.php >> /var/log/php_cron_full.log 2>&1
这样即使是PHP未捕获的低级错误或系统级提示,也会被记录下来。
2. 强制开启PHP全局错误日志
脚本内的error_reporting配置可能覆盖全局设置,执行PHP时直接强制启用全量错误记录:
* * * * * /usr/bin/php -d error_reporting=E_ALL -d log_errors=On -d error_log=/var/log/php_cron_errors.log /path/to/your/script.php >> /var/log/php_cron_full.log 2>&1
该命令会绕过脚本内的错误配置,确保所有错误都写入指定日志。
3. 检查OOM Killer系统日志
负载升高时可能触发内核OOM Killer但未被PHP日志捕获,直接查看系统级日志:
grep -i oom /var/log/syslog /var/log/messages # 或查看内核环缓冲区 dmesg | grep -i oom
OOM Killer终止进程时会在这些日志中留下明确的进程ID和原因记录。
4. 配置systemd-coredump强制生成核心转储
之前未生成核心转储可能是因为系统限制了转储大小:
- 先检查当前限制:
ulimit -c,若输出为0则表示禁用了核心转储 - 在crontab开头添加全局限制:
ulimit -c unlimited - 或修改
/etc/security/limits.conf永久生效:* soft core unlimited * hard core unlimited - 重启cron和systemd-coredump服务:
systemctl restart cron systemctl restart systemd-coredump - 确保
/etc/systemd/coredump.conf中设置:Storage=external Compress=yes
5. 用strace跟踪系统调用
通过strace记录进程终止前的所有系统调用,定位信号来源:
- 手动测试时执行:
strace -f -o /var/log/php_strace.log /usr/bin/php /path/to/your/script.php - 加入Cron任务时用时间戳命名日志避免覆盖:
* * * * * strace -f -o /var/log/php_strace_$(date +\%Y\%m\%d\%H\%M\%S).log /usr/bin/php /path/to/your/script.php >> /var/log/php_cron_full.log 2>&1
日志中会明确显示进程是否被信号(如SIGKILL/SIGSEGV)终止。
6. 检查Cron自身执行日志
查看Debian默认的Cron日志,确认任务是否被正常触发:
grep CRON /var/log/syslog
可排查是否是Cron调度异常而非脚本崩溃。
7. 启用OPcache日志(若使用)
如果脚本依赖OPcache,负载高时可能出现缓存相关错误,在PHP配置中添加:
opcache.log_verbosity_level=3 opcache.error_log=/var/log/php_opcache.log
CLI模式下PHP每次执行都会读取该配置,OPcache的错误会被完整记录。
内容的提问来源于stack exchange,提问作者Vlad Imir
相关产品推荐
相关产品推荐

