使用strace -ttp 16178 kill -SIGALRM 16178
看起来是业务自己创建了子进程,并调用pcntl_wait 等待子进程退出。看下业务或者业务使用的库是否有调用pcntl_fork、 pcntl_wait
额 没有呢 业务里面有curl 请求 和 exec 的执行
那应该是 exec 执行的是慢任务导致的
额 慢任务会导致这个么 有没有什么处理办法 或者设置超时时间让他直接放弃这个任务
如果你确定exec是慢任务,可以不用管它。busy状态表明当前进程在忙于业务,并不一定产生了问题。exec函数不支持超时,即使你设置了超时参数比如2秒,status状态还是busy。
现在是这样,过一段时间进程会一个一个挂掉,然后会报错连接不上redis 5秒。我restart -d 以后恢复正常
你用 proc_open 代替exec吧,proc_open用法看下php手册。每次执行的时候设定一个定时器,比如2秒后关闭proc_open打开的进程。 伪代码类似
$r = proc_open(); Timer::add(2, function() use ($r) { proc_close($r); });
好的 我尝试下
看起来是业务自己创建了子进程,并调用pcntl_wait 等待子进程退出。看下业务或者业务使用的库是否有调用pcntl_fork、 pcntl_wait
额 没有呢 业务里面有curl 请求 和 exec 的执行
那应该是 exec 执行的是慢任务导致的
额 慢任务会导致这个么 有没有什么处理办法 或者设置超时时间让他直接放弃这个任务
如果你确定exec是慢任务,可以不用管它。busy状态表明当前进程在忙于业务,并不一定产生了问题。exec函数不支持超时,即使你设置了超时参数比如2秒,status状态还是busy。
现在是这样,过一段时间进程会一个一个挂掉,然后会报错连接不上redis 5秒。我restart -d 以后恢复正常
你用 proc_open 代替exec吧,proc_open用法看下php手册。每次执行的时候设定一个定时器,比如2秒后关闭proc_open打开的进程。
伪代码类似
好的 我尝试下