Workerman进程异常退出后自动拉起,依赖Master进程捕获SIGCHLD信号并调用pcntl_waitpid()判断退出状态,非正常退出(exit code ≠ 0)即立即重启Worker;前提是Master未崩溃、未被SIGSTOP挂起,且Worker由Master fork启动并保持在同一进程组。

Workerman进程异常退出后自动拉起,依赖主进程(Master)对子进程(Worker)的实时监控与重建能力,无需额外编码即可生效;但前提是主进程本身未崩溃,且未被SIGSTOP挂起。
主进程自动拉起Worker的触发条件
当Worker进程因段错误、PHP致命错误、OOM Kill或被kill -9终止时,操作系统会向Master进程发送SIGCHLD信号;Master捕获该信号后,立即调用pcntl_waitpid()获取退出状态,确认非正常退出(exit code ≠ 0)即启动拉起流程。
若Worker是收到SIGTERM后优雅退出(如执行stop命令),Master不会补足进程数——这是设计行为,不是故障。
【必须确保Worker进程由Master fork启动,且未脱离其进程组】。如果Worker在代码中调用posix_setsid()或自行daemonize,Master将失去对其生命周期的控制,自动拉起失效。
验证自动拉起是否正常工作
方法一:主动触发段错误测试
执行kill -SEGV $(pgrep -f "php start.php")(仅限测试环境),随后立刻检查error.log:应出现"worker process XXX exited on signal 11"及紧随其后的"start new worker process"类日志。
方法二:观察进程PID变化
运行ps -ef | grep 'php start.php' | grep -v grep,记下Worker PID;杀掉其中一个后等待3秒,再次执行该命令——新PID应已出现,且旧PID消失。
方法三:模拟PHP致命错误
在Worker业务逻辑中临时插入throw new Error('test fatal');,触发进程崩溃;查看日志中是否有连续的"exit"和"fork"记录,间隔应小于1秒。
systemd守护Master进程(防主进程意外退出)
第一步:创建服务文件/etc/systemd/system/workerman.service
内容如下:
[Unit]
Description=Workerman Service
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/php /var/www/myapp/start.php start --daemon=0
Restart=always
RestartSec=3
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
第二步:启用并启动服务
sudo systemctl daemon-reload && sudo systemctl enable workerman && sudo systemctl start workerman
第三步:确认服务状态
运行sudo systemctl status workerman,输出中必须显示"active (running)"且"Main PID"与Master进程PID一致;若显示"failed",重点检查User权限和WorkingDirectory路径是否存在。
【User必须是非root用户(如www-data),否则Workerman bind端口时会报Permission denied】。

















