启动出现了两个master进程,求助

global_zm

[attach]2421[/attach]
start -d 启动出现了两个master进程。让我执行stop的时候就会失败。目前的情况是并不影响整个程序业务流程这些。

3873 3 0
3个回答

blogdaren

原因: 这个一般是误删 workerman 的主进程pid文件造成的;
解决: 在不影响服务的情况下, ps aux | grep xxxx | xargs kill 干掉其中被误删的那个主进程以及子进程;或者干脆全部kill 干掉重启。

  • global_zm 2019-09-11

    试过了,全部kill所有WorerMan的进程,然后再start -d 就会出现这个问题。不用守护进程的形式是没有问题的

  • blogdaren 2019-09-11

    方便的话,贴下启动文件 server.php。

  • global_zm 2019-09-12

    @614:我贴到回复里面了,麻烦大佬空了瞅瞅呢,非常感谢

  • global_zm 2019-09-12

    workman的版本是3.5.19

global_zm

CoreServer 继承了 Workerman\WebServer
我们发现,在Worker::runAll()方法里面的static::daemonize()里,不正常服务器fork的两次进程都在

我们有两个服务器,其中一个服务器(正常),第一个fork的进程会被结束掉;
另外一个服务器(不正常)两个主进程的,就会出现第一个fork也还在,所以就出现了两个主进程。对这种没有经验,不知道为啥会出现这种情况。
 
有问题的两个主进程还会出现后面那张图的关系

  • blogdaren 2019-09-12

    28828 和 28829 是分别对应的两个master进程的pid吗? 两台机器的环境不一致吗? OS是Linux 的哪个发行版?

  • blogdaren 2019-09-12

    另外检查下异常机器上static::daemonize()里, 第二个pcntl_fork() 段里的 exit语句是不是被误注释或删掉了? 还有这个CoreServer类里有没有额外进行过 fork 的行为? 能想到的就这些了。

  • global_zm 2019-09-16

    @614:28828 和 28829 就是那两个master进程的pid,系统内核版本情况,两个系统都是一样的:
    Linux version 4.4.0-151-generic (buildd@lgw01-amd64-043) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) ) #178-Ubuntu SMP Tue Jun 11 08:30:22 UTC 2019
    搜了下CoreServer也没有fork的额外行为。这个问题目前看来确实很奇怪。不影响整个程序的执行使用,但是就不能平滑重启了,必须每次kill了再启动

  • global_zm 2019-09-16

    @614:我把第二个fork相关的代码去掉会不会有什么影响?

  • blogdaren 2019-09-16

    @5370:
    1、第二个fork 禁止去掉,那个是为了防止 svr4类系统获得终端控制权而设;
    2、先确认下两台机器的PHP版本是否一致? 以确保pcntl扩展OK, 否则就是使用了有BUG的PHP;
    3、如果PHP版本一致,那么怀疑极有可能是 glibc 的问题【即glibc的fork可能有bug】,你看下两台机器的 glibc 库版本一致吗?

global_zm

谢谢@https://wenda.workerman.net/people/blogdaren
问题找到了,安装了一个grpc的扩展,然后这个扩展必须要给对应的环境变量,不然fork的时候就会出现多一个挂载进程。给后来的同学参考:以后出现这类的问题,也可以考虑下安装的扩展本身在workman进行fork的时候带来的问题

  • blogdaren 2019-09-17

    嗯,对, 很多参差不齐的PHP扩展也会带来潜在的隐患,据观察,还不在少数。

年代过于久远,无法发表回答
🔝