来源,原站已无法打开
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
没有设置超时时间,服务器没有及时反应或无法响应的情况下造成了假死现象。
经过调整之后,进程运行正常。