Skip to content

停止失败

现象:

运行 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 出一个挂载进程,停止时导致失败。

基于 MIT 许可发布