不能。Supervisor仅监控进程存活性,无法感知Workerman的SIGUSR1平滑reload;其autorestart仅在主进程崩溃或异常退出时触发,不适用于热更新或文件变更自动重载。

Supervisor 能不能直接监控 Workerman 的 reload 行为?
不能。Supervisor 只管进程“存不存在”,不管它内部有没有平滑重启逻辑。Workerman 的 php start.php reload 是向主进程发 SIGUSR1,由 Workerman 自己 fork 新子进程、优雅下线旧进程——整个过程主进程 PID 不变,Supervisor 根本感知不到“变化”,更不会触发 autorestart。
所以别指望 Supervisor 帮你监听代码改动并 reload;它只在 Workerman 主进程彻底崩溃(比如 segfault、OOM kill)或异常退出(exit code ≠ 0)时才拉起新进程。
- ✅ 正确用途:兜底防 crash,保障服务不长时间离线
- ❌ 错误期待:代替
Monitor组件做热更新、文件变更自动 reload - ⚠️ 注意:
autorestart=true对 Workerman 守护模式(-d)有效,但对非守护模式(开发调试时直接运行)可能反复启停,导致日志刷屏
Workerman 进程被 Supervisor 管理时的关键配置项
Workerman 默认会自行 fork 子进程,而 Supervisor 也期望管理“前台进程”。两者若没协调好,极易出现 FATAL 或 STARTING 卡死状态。
-
command=/usr/bin/php /path/to/start.php start -d:必须加-d,否则 Workerman 启动后立即退出(前台模式),Supervisor 会不断重试启动 -
autorestart=true:启用崩溃后自动拉起,但建议配合startretries=3和startsecs=5,避免启动失败循环刷日志 -
user=www-data或实际运行用户:Workerman 若用 root 启动再chuid切用户,容易因权限问题写日志失败,直接指定用户更稳 -
redirect_stderr=true+stdout_logfile=...:务必开启,否则 Workerman 的 warning/fatal 日志全丢进黑洞,排查时只能翻/var/log/supervisor/supervisord.log -
stopasgroup=true和killasgroup=true:Workerman 子进程是进程组,不加这两项,supervisorctl stop可能只杀主进程,留下僵尸 worker
为什么 Workerman 经常在 Supervisor 下报 FATAL?常见错误现象与解法
最典型报错:gave up: workerman entered FATAL state, too many start retries too quickly。这不是 Supervisor 故障,而是 Workerman 启动失败了三次以上,Supervisor 主动放弃。
-
现象:
supervisorctl status显示FATAL,tail -f /var/log/supervisor/supervisord.log看到 “Exited too quickly (process log may have details)” - 原因 1:Workerman 启动脚本里有未捕获的 PHP Fatal Error(如类没找到、语法错),主进程秒退 → Supervisor 认定失败
-
原因 2:端口被占(
Address already in use)、配置文件路径错误、require的扩展未安装(如swoole或pcntl) -
解法:先手动执行
/usr/bin/php /path/to/start.php start(不加-d),看完整报错;修复后再切回守护模式交给 Supervisor -
隐藏坑:Workerman 的
Worker::$daemonize = true和 Supervisor 的-d参数重复设置,会导致双重 fork 异常 —— 代码里必须设为false,只靠 Supervisor 管理后台化
要不要开 Supervisor 的 Web 界面?Workerman 场景下其实很鸡肋
Web 界面(inet_http_server)能看状态、点按钮重启,但对 Workerman 这类多子进程、高并发的服务,作用有限。
- ✅ 适合:快速确认进程是否 running、临时 stop/start 单个服务
- ❌ 不适合:查子进程崩溃原因(Web 界面不显示 stderr)、定位哪个 worker 挂了、看实时连接数或内存占用
-
port=0.0.0.0:9001必须配username/password,否则暴露内网也危险;生产环境建议关掉或绑定127.0.0.1 - 真正有用的监控,得靠 Workerman 自身的
status命令或对接 Prometheus +workerman-exporter,不是靠 Supervisor 的网页
Workerman 的健壮性不在“能不能重启”,而在“为什么总要重启”——Supervisor 是安全带,不是刹车片。把 Monitor 用好、日志收全、错误提前拦截,比依赖自动重启更重要。










