workerman 4.0.20 必须配合 supervisor 的 stopasgroup/killasgroup 和 -d 参数才能稳定驻留、自动拉起且无子进程残留;否则易陷 fatal 状态或僵尸进程。

用 Supervisor 管理 Workerman 4.0.20 的进程,目标是让服务稳定驻留后台、崩溃自动拉起、日志可查可控——但直接套用通用配置大概率会卡在 FATAL 状态或子进程残留,因为 Workerman 4.0.20 的多进程模型与 Supervisor 的父子进程管理逻辑存在底层冲突,必须针对性协调。
确认 Workerman 启动脚本兼容守护模式
打开你的 start.php 或实际启动文件,检查是否已启用守护进程支持。Workerman 4.0.20 默认支持 -d 参数,但需确保未在代码中手动调用 exit() 或提前终止主流程。
运行命令验证:执行 php start.php start -d 后,立即用 ps aux | grep start.php 查看是否有主进程(含 master 关键字)且无报错退出。若几秒后进程消失,说明脚本内部有异常或未完成 daemonize 流程。
这一步不通过,Supervisor 配置再正确也只会反复报 gave up: xxx entered FATAL state。
Supervisor 配置关键项设置
在 /etc/supervisor/conf.d/workerman.conf 中新建配置文件,内容如下:
方法一:基础可靠配置(推荐用于生产)
[program:workerman]
command=/usr/bin/php /var/www/myapp/start.php start -d
autostart=true
autorestart=true
startretries=3
startsecs=5
user=www-data
redirect_stderr=true
stdout_logfile=/var/log/workerman.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=5
stopasgroup=true
killasgroup=true
environment=PHP_IDE_CONFIG="serverName=local"
【command 必须带 -d 参数】,否则 Workerman 前台启动后立刻退出,Supervisor 会判定为异常退出并无限重试。
方法二:开发调试精简版(禁用自动重启)
[program:workerman-dev]
command=/usr/bin/php /var/www/myapp/start.php start
autostart=false
autorestart=false
user=developer
redirect_stderr=true
stdout_logfile=/tmp/workerman-dev.log
stopasgroup=true
killasgroup=true
此配置不启用 autorestart,适合本地联调时手动控制启停,避免因代码错误导致 Supervisor 不断刷日志。
启动并验证 Supervisor 管理状态
第一步:重新加载配置
执行 sudo supervisorctl reread → sudo supervisorctl update。
第二步:启动服务
执行 sudo supervisorctl start workerman。
第三步:检查状态
运行 sudo supervisorctl status,正常应显示 workerman RUNNING pid 12345, uptime 0:01:23;若显示 FATAL,立刻执行 sudo tail -n 20 /var/log/supervisor/supervisord.log 查看最近失败原因。
第四步:验证进程组清理能力
手动触发一次 Workerman 崩溃(如在代码中插入 exit(1)),等待几秒后执行 sudo supervisorctl status,确认状态变为 STARTING → RUNNING,且 ps aux | grep start.php 显示新 PID,旧进程完全消失。
注意:【stopasgroup 和 killasgroup 必须同时开启】,否则 supervisorctl stop workerman 只杀主进程,worker 子进程变成僵尸,下次 start 会因端口占用失败。











