在生产环境restart之后 程序没有完全停止导致端口被占用

twobody

问题描述

在生产环境中 php start.php restart之后
Fatal error: Uncaught Exception: Address already in use in

程序代码或配置

29403

重现问题的步骤

第一次的stopping的日志是正常输出的,因为pid文件中的pid值和系统的对的上,然后看了下只stop了两个pid,导致start的时候端口被占用了。
截图
截图

操作系统环境及workerman/webman等具体版本

这里写具体的系统环境相关信息
php版本 8.1
系统是centos
本地mac运行没这个问题

626 1 0
1个回答

walkor 打赏

出现这个问题一般是因为runtime下的pid文件和系统实际情况不一致导致的,
stop时会通过pid文件找到进程,然后停止。如果pid文件里的记录值是错的导致无法停止之前的进程,再次启动时会报占用错误。

造成pid文件不一致的原因一般是将错误的将pid文件放到了代码库,或者上传文件时上传了本地的pid等原因。
另外如果有手动kill了workerman的主进程,子进程还存在,也会有此问题。

社区里反馈有一些扩展影响了php的行为例如grpc扩展没有正确配置也会类似问题。

如果不是以上原因需要自己定位下,停止前cat下pid文件值,运行 ps auxf 看下进程树,看下是否对应。stop后 ps auxf 看下进程树是否正确。

  • 软饭工程师 2024-01-11

    如果某些操作导致主进程被杀死,子进程还在运行,php start.php stop 提示no run,php start.php start 提示端口被占用,这种情况有什么比较好的办法吗,只能手动一个个把子进程杀死?

  • walkor 2024-01-11

    一个一个杀死

  • twobody 2024-01-12

    感谢回复,目前没有再出现过

×
🔝