while(1){
\pcntl_signal_dispatch();
//業(yè)務邏輯
}
這個代碼在ubuntu下測試能夠正常退出,但是在centos7下測試無法優(yōu)雅退出,請問是什么問題呢?
單貼這么一個while()碎片代碼什么問題也看不出來, 另外kill發(fā)送的什么信號? 測試代碼貼全,測試步驟寫清楚。
while循環(huán)在onworkerstart里執(zhí)行,沒有監(jiān)聽端口只是單純的多進程任務,kill pid沒有指定特定的信號,主要現象就是在centos7下主進程收到restart -g或者stop -g命令時打印出stoping日志,然后就卡住了,子進程沒有退出,仍然在正常運行,但是在ubuntu下沒有這個問題,業(yè)務邏輯可以用sleep(1)或者其他,都一樣
解決了就好.
不過不清楚你具體都改了啥?workerman子進程里已經重裝過基于事件的信號,為什么還需要重裝下信號呢? 另外終端直接kill pid 默認發(fā)送的是SIGTERM信號,這和通過 php start.php xxxx -g 本質上是一樣的,workerman處理SITERM信號時,子進程如果有死循環(huán),就會導致子進程無法陷入事件循環(huán),進而導致信號就會處于未決狀態(tài),自然子進程就無法退出,換句話onWorkerStart回調里禁止使用while死循環(huán),既可能會引起進程阻塞也可能引起CPU飆升;但是如果直接CTRL+C 或者 php start.php stop 或者 kill -SIGINT pid,這三者本質一樣、而且事實上情況基本和前述類似,最大的區(qū)別是父進程會在必要的時間內期滿后強制干掉所有的子進程,即發(fā)送了kill -9 到所有的子進程;
多謝解答!我是因為業(yè)務需要在死循環(huán)里處理隊列數據,但是又擔心在重啟時因為強制退出會導致數據丟失,才提的這個問題,經實驗證明,在業(yè)務邏輯里重新注冊新號,可以實現平滑重啟需求.