restart -g在centos7下面测试问题workermen4.1

www

while(1){
\pcntl_signal_dispatch();
//业务逻辑
}
这个代码在ubuntu下测试能够正常退出,但是在centos7下测试无法优雅退出,请问是什么问题呢?

1348 4 0
4个回答

www

补充下,在ubuntu下,kill 主进程id,服务可以正常关闭,centos下无反应

  • 暂无评论
blogdaren

单贴这么一个while()碎片代码什么问题也看不出来, 另外kill发送的什么信号? 测试代码贴全,测试步骤写清楚。

  • www 2020-05-27

    while循环在onworkerstart里执行,没有监听端口只是单纯的多进程任务,kill pid没有指定特定的信号,主要现象就是在centos7下主进程收到restart -g或者stop -g命令时打印出stoping日志,然后就卡住了,子进程没有退出,仍然在正常运行,但是在ubuntu下没有这个问题,业务逻辑可以用sleep(1)或者其他,都一样

  • www 2020-05-27

    不用考虑权限问题,业务逻辑问题,都试过的.目前发现centos里kill 主pid时,似乎子进程没有收到信号,还在验证中,请多多指点!

www

搞定了,不是没收到信号,是信号被忽略了,自己重新安装信号后,收到信号exit就可以了

  • 暂无评论
blogdaren

解决了就好.

不过不清楚你具体都改了啥?workerman子进程里已经重装过基于事件的信号,为什么还需要重装下信号呢? 另外终端直接kill pid 默认发送的是SIGTERM信号,这和通过 php start.php xxxx -g 本质上是一样的,workerman处理SITERM信号时,子进程如果有死循环,就会导致子进程无法陷入事件循环,进而导致信号就会处于未决状态,自然子进程就无法退出,换句话onWorkerStart回调里禁止使用while死循环,既可能会引起进程阻塞也可能引起CPU飙升;但是如果直接CTRL+C 或者 php start.php stop 或者 kill -SIGINT pid,这三者本质一样、而且事实上情况基本和前述类似,最大的区别是父进程会在必要的时间内期满后强制干掉所有的子进程,即发送了kill -9 到所有的子进程;

  • www 2020-07-21

    多谢解答!我是因为业务需要在死循环里处理队列数据,但是又担心在重启时因为强制退出会导致数据丢失,才提的这个问题,经实验证明,在业务逻辑里重新注册新号,可以实现平滑重启需求.

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