生产环境Supervisor管理的Laravel队列worker被SIGKILL终止如何排查?
排查方向
1. Supervisor配置项限制
首先检查对应worker的supervisor配置段:
- 确认
stopwaitsecs参数值,默认值仅为10秒,若任务执行时长超过该值,supervisor会先发送SIGTERM信号,超时后直接发送SIGKILL强制杀死进程,该值必须大于队列任务的最大执行时长(你配置的--max-time=3600对应stopwaitsecs至少要设为3660以上) - 检查是否配置了
memory_limit参数,若单worker进程内存占用超过该阈值会被直接杀死 - 确认
autorestart参数配置是否符合预期,避免异常退出后未按预期重启
2. Laravel队列配置超时
- 检查
config/queue.php中对应队列驱动的retry_after参数,若该值小于任务实际执行时长,Laravel会判定任务执行失败,将其放回队列重试,同时原运行中的进程可能被强制回收 - 检查初始化任务类是否单独设置了
$timeout属性,若该值小于任务执行时长会触发worker主动退出 - 若使用Horizon管理队列,需检查Horizon对应队列的超时配置,全局或队列级别的超时限制优先级高于worker启动参数
3. 系统层面进程限制
- 执行
dmesg | grep -E 'kill|oom'查看系统日志,确认是否为OOM Killer杀死进程:即使整机内存使用率低,部分VPS、容器环境会配置单进程内存阈值、cgroup内存限制,超出后会直接发送SIGKILL - 检查是否存在定时任务、安全防护软件(如fail2ban、主机安全Agent)的策略,是否会主动杀掉运行时长超过阈值的php-cli进程
4. 任务逻辑与运行时配置
- 检查PHP CLI的错误日志、Laravel的
storage/logs目录日志,确认进程被杀死前是否存在未捕获的Fatal Error、数据库断开连接、外部接口调用超时等异常 - 优化任务幂等性:给初始化逻辑加前置判断,创建数据库前先校验是否已存在,避免重试时出现重复创建的报错;核心步骤包裹数据库事务,中途异常时自动回滚已执行的操作
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

