我试图kill 31216 31617 ,但是经过10次之后,这个过程依然存在。
为什么?
有没有办法强迫它死亡?
root 31216 1 0 10:49 ? 00:00:00 nginx: master process /root/nginx-1.0.2/objs/nginx -c /root/nginx-1.0.2/conf/nginx.conf nobody 31217 31216 0 10:49 ? 00:00:00 [nginx] <defunct>
当你用kill pid杀死一个进程时,你正在发送一个SIGTERM。 有时一个进程陷入了一个不听信号的状态。 当发生这种情况时,试着kill -9 pid ,这可能会杀死它。
在这种情况下,失效进程(31217)将不能被杀死,但父进程(31216)应该死亡并且用它的subprocess。
从手册页:
命令kill将指定的信号发送到指定的进程或进程组。 如果没有指定信号,则发送TERM信号。 TERM信号将终止不捕获该信号的进程。 对于其他进程,可能需要使用KILL(9)信号,因为这个信号不能被捕获。
在Unix和类似Unix的计算机操作系统上, 僵尸进程或已停止进程是已经完成执行但仍在进程表中的进程。 该条目仍然需要允许启动(现在是僵尸)进程的进程读取其退出状态。 术语僵尸进程来自僵尸的一个普通的定义 – 一个不死的人。 在这个词的比喻中,孩子的过程“已经死了”,但还没有“收获”。 另外,与普通进程不同,kill命令对僵尸进程没有影响。
来源: 维基
编辑 :
要从系统中删除僵尸,可以使用kill命令手动将SIGCHLD信号发送到父级。 如果父进程仍然拒绝收获僵尸,下一步将是删除父进程。 当一个进程失去父进程时,init成为它的新父进程。 Init定期执行等待系统调用以获取任何具有init的僵尸作为父项。
来源: 维基
当前处于不间断系统调用(例如运行内核代码)的进程不能被终止。 你可以使用strace或者类似的工具来找出它的位置,这样你就可以尝试解开它。