ThinkPHP + Supervisor 队列任务丢失:僵尸 Worker 排查全记录

僵尸进程

程序:thinkphp6+think-queue

环境:宝塔linux+Supervisor

问题现象:

我有一个脚本,每半个小时查询需要执行的任务,再通过消费队列的方式,投递执行。

已知,当前半个小时执行数量20,从11:30到14:00,理论上在日志中,至少有120条记录,日志只有不到10条,而且消费的任务名称不一致(我在日志中会输出当前执行的是什么任务),无规律,

也就是出现任务丢失。

查看thinkphp的log,无异常。查看队列的异常log,也无异常。

排查发现,其他队列正常。只有cron这个处理定时任务的队列异常。

在Supervisor重启cron后,14:00那一轮也只有2条。

排查发现

bash 复制代码
[root@iZ8vbhyenz6cZ public]# ps aux | grep -E "queue:work.*cron"
root      197330  0.0  0.5 223276 45300 ?        S    14:13   0:00 php think queue:work --queue cron --tries 1 --timeout 300
root      198191  0.0  0.0   5756   940 pts/1    S+   14:17   0:00 grep --color=auto -E queue:work.*cron
root     1278768  0.0  1.3 321236 104348 ?       S    May25   5:26 php think queue:work --queue cron --tries 1 --timeout 300
root     3919432  0.0  0.4 227376 32128 ?        S    11:24   0:02 php think queue:work --queue cron --tries 1 --timeout 300
[root@iZ8vbhyenz6cZ public]# /www/server/panel/pyenv/bin/supervisorctl status | grep -i cron
cron:cron_00                                                 RUNNING   pid 197330, uptime 0:04:15
[root@iZ8vbhyenz6cZ public]#

发现了,3个进程同时在消费同一个 cron 队列。

Supervisor用的是197330,而我设置的进程数量只有1,理论上就应该只有1个进程。

那就意味着,冒出来的1278768 、3919432是异常的,大概率分发到他们了,进程在但实际未工作。

bash 复制代码
# 杀掉两个僵尸 Worker(1278768 和 3919432)
kill -9 1278768 3919432

# 确认杀干净了
ps aux | grep -E "queue:work.*cron"

重新投递未执行成功的任务。正常。

14:30那一轮也正常执行了。

你好,我是勤勤学长。

相关推荐
小马爱打代码2 小时前
MySQL高可用与扩展:主从复制、读写分离、分库分表
服务器·数据库·mysql
Shingmc32 小时前
【Linux】多路转接之epoll
linux·运维·服务器·开发语言·网络
心满意足的大脸猫2 小时前
Win11 开启 SSH 服务器与密钥登录配置记录
服务器·microsoft·ssh
utf8mb4安全女神2 小时前
磁盘管理(交换分区)(MGR分区)(GPT分区)
linux·运维·服务器
linlinlove22 小时前
前端uniapp、后端thinkphp股票系统开发功能展示、代码披露、HQChart
前端·uni-app·echarts·thinkphp·hqchart·配资·deepseek选股票
humors2212 小时前
聊聊密码为啥会“白设”
大数据·运维·服务器·网络·网络安全
2301_777998342 小时前
进程控制:进程创建、进程终止、进程等待、进程程序替换
linux·服务器
为思念酝酿的痛3 小时前
线程同步与互斥
linux·运维·服务器·后端
土星云SaturnCloud3 小时前
模型转换与部署实战(PyTorch→ONNX→BModel)
服务器·人工智能·ai·边缘计算