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