You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel SQS队列无消息时仍无法停止的问题咨询

问题分析与解决办法

核心问题排查

你的配置尝试在worker处理完队列后手动终止supervisord,但队列空时任务仍持续运行,大概率是以下原因导致:

  • PID文件读取失败:容器中/var/run目录可能无写入权限,supervisord无法生成supervisord.pid文件,后续cat supervisord.pid获取不到PID,kill指令无法执行,supervisord一直前台运行。
  • Bash命令解析异常:用反引号`cat ...`嵌套在双引号中,容易出现语法解析问题,导致kill命令不生效。
  • Supervisord退出逻辑问题:前台运行模式(nodaemon=true)下,supervisord默认不会随子进程退出而终止,需主动触发信号。

修正后的配置方案

方案1:修复PID文件路径与命令语法

改用/tmp目录存储PID文件(容器中该目录默认有写入权限),同时用$()替代反引号避免解析错误:

[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid
stdout_logfile=/dev/stdout
stderr_logfile=/dev/stderr

[program:job-worker]
process_name=%(program_name)s_%(process_num)02d
command=bash -c "php /srv/app/artisan queue:work sqs-fifo --tries=3 --stop-when-empty --queue=demo_queue.fifo && kill -s SIGINT $(cat /tmp/supervisord.pid)"
autostart=true
autorestart=false
stopasgroup=true
killasgroup=true
numprocs=1
redirect_stderr=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
exitcodes=0
startretries=0

方案2:移除手动kill,让supervisord自动退出

通过配置调整,当worker正常退出后,触发supervisord终止:

[supervisord]
nodaemon=true
pidfile=/tmp/supervisord.pid
stdout_logfile=/dev/stdout
stderr_logfile=/dev/stderr
exitcodes=0

[program:job-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /srv/app/artisan queue:work sqs-fifo --tries=3 --stop-when-empty --queue=demo_queue.fifo
autostart=true
autorestart=false
stopasgroup=true
killasgroup=true
numprocs=1
redirect_stderr=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
exitcodes=0
startretries=0

可在容器启动脚本中补充逻辑:当supervisord的所有子进程退出后,执行supervisorctl shutdown主动终止supervisord。

额外验证步骤

  • 确认SQS队列完全为空:包括可见消息、处理中隐藏的消息,否则worker会继续等待。
  • 查看容器日志:执行docker logs <容器ID>,检查worker是否输出Queue is empty. Exiting.,判断是否正常触发退出逻辑。

内容的提问来源于stack exchange,提问作者Naveed Zahoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:22:13