首先通過strace
命令跟蹤假死進程的系統調用信息
strace -p 16618
執行以上命令后,得到如下結果
poll([{fd=33, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout) poll([{fd=33, events=POLLOUT}], 1, 1000) = 0 (Timeout) poll([{fd=33, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout) poll([{fd=33, events=POLLOUT}], 1, 1000) = 0 (Timeout)
Tips: 通過命令
man poll
可以查看poll系統調用的函數原型
發現當前進程占用了33
的文件描述符,接着可以通過下面的命令列出占用該文件描述符的進程
lsof -d 33 | grep php
得到如下結果
php 16618 root 33u IPv4 987105 0t0 TCP iZbp10yq5syyio54pew3swZ:56030->192.168.110.2:http (SYN_SENT)
可以看到當前進程正在進行http
請求,並且處於SYN_SENT
的狀態 (長期處於該狀態),最后猜想可能是由於curl
沒有設置超時時間,服務器沒有及時反應或無法響應的情況下造成了假死現象。
經過調整之后,進程運行正常。
碼字很辛苦,轉載請注明來自
雨林寒舍的
《CLI下php進程假死問題排查》