停止失败
现象:
运行 php start.php stop
提示 stop fail
第一种可能性
前提是以 debug 方式启动的 workerman,开发者在终端按了 ctrl z
给 workerman 发送了 SIGSTOP
信号,导致 workerman 进入后台并挂起 (暂停),所以无法响应 stop 命令 ( SIGINT
信号)。
解决: 在启动 workerman 的终端输入 fg
(发送 SIGCONT
信号) 然后回车,将 workerman 切回前台运行,按 ctrl c
(发送 SIGINT
信号) 停止 workerman。
如果无法停止,尝试运行以下两条命令
killall -9 php
ps aux|grep -i workerman|awk '{print $2}'|xargs kill -9
第二种可能性
运行 stop 的用户和 workerman 启动用户不一致,即 stop 用户没有权限停止 workerman。
解决: 切换到启动 workerman 的用户,或者用权限更高的用户停止 workerman。
第三种可能性
保存 workerman 主进程 pid 文件被删除,导致脚本找不到 pid 进程,导致停止失败。
解决: 将 pid 文件保存到安全的位置,参见手册 Worker::$pidFile。
第四种可能性
workerman 主进程 pid 文件对应的进程不是 workerman 进程。
解决: 打开 workerman 的主进程的 pid 文件查看主进程 pid,pid 文件默认在 Workerman 平行的目录里。运行命令 ps aux | grep 主进程pid
查看对应的进程是否是 Workerman 进程,如果不是,可能是服务器重启过,导致 workerman 保存的 pid 是过期的 pid,而这个 pid 刚好被其它进程使用,导致停止失败。如果是这种情况,将 pid 文件删除即可。
第五种可能性
安装了 grpc 扩展,但是没有给 grpc 扩展设置相应的环境变量,启动后会多 fork 出一个挂载进程,停止时导致失败。