进程P起了两个进程p1和p2,然后wait(p1); p1通过管道写数据到p2;当p2工作异常后,p1写给p2的数据不能被处理,导致管道阻塞了p1;当发现p2异常后,试图kill -9 杀死p2;纠结出现了:
P当前只wait(p1),对于p2的死不做任何反应,由于暂时没人为p2收尸,p2只能处于<defunct>状态,虽然p2已经注定了死亡的命运,但是p1和p2之间的管道依然存在(还没被销毁,可见,p2的资源是需要P来回收的),p1将不会得到任何异常通知,依然在等待; 于是乎,出现了循环等待了。
解决办法倒是比较简单,把P给kill了就行了;只是这个状态比较纠结
gitlab 里面的runsvdir 居然能把进程的错误写到进程名上,如下(省的你看不见?):