停止失敗
現(xiàn)象:
運(yùn)行 php start.php stop
提示 stop fail
第一種可能性
前提是以debug方式啟動的workerman,開發(fā)者在終端按了ctrl z
給workerman發(fā)送了SIGSTOP
信號,導(dǎo)致workerman進(jìn)入后臺并掛起(暫停),所以無法響應(yīng)stop命令(SIGINT
信號)。
解決:
在啟動workerman的終端輸入fg
(發(fā)送SIGCONT
信號)然后回車,將workerman切回前臺運(yùn)行,按ctrl c
(發(fā)送SIGINT
信號)停止workerman。
如果無法停止,嘗試運(yùn)行以下兩條命令
killall -9 php
ps aux|grep -i workerman|awk '{print $2}'|xargs kill -9
第二種可能性
運(yùn)行stop的用戶和workerman啟動用戶不一致,即stop用戶沒有權(quán)限停止workerman。
解決:
切換到啟動workerman的用戶,或者用權(quán)限更高的用戶停止workerman。
第三種可能性
保存workerman主進(jìn)程pid文件被刪除,導(dǎo)致腳本找不到pid進(jìn)程,導(dǎo)致停止失敗。
解決:
將pid文件保存到安全的位置,參見手冊Worker::$pidFile。
第四種可能性
workerman主進(jìn)程pid文件對應(yīng)的進(jìn)程不是workerman進(jìn)程。
解決:
打開workerman的主進(jìn)程的pid文件查看主進(jìn)程pid,pid文件默認(rèn)在Workerman平行的目錄里。運(yùn)行命令 ps aux | grep 主進(jìn)程pid
查看對應(yīng)的進(jìn)程是否是Workerman進(jìn)程,如果不是,可能是服務(wù)器重啟過,導(dǎo)致workerman保存的pid是過期的pid,而這個pid剛好被其它進(jìn)程使用,導(dǎo)致停止失敗。如果是這種情況,將pid文件刪除即可。
第五種可能性
安裝了grpc擴(kuò)展,但是沒有給grpc擴(kuò)展設(shè)置相應(yīng)的環(huán)境變量,啟動后會多fork出一個掛載進(jìn)程,停止時導(dǎo)致失敗。