PHP进程卡住假死问题处理

来源,原站已无法打开
https://www.im050.com/posts/390

首先通过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没有设置超时时间,服务器没有及时反应或无法响应的情况下造成了假死现象。

经过调整之后,进程运行正常。