我正在尝试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>
答案1
当您使用 终止进程时kill pid
,您将发送 SIGTERM。有时进程会卡在无法监听信号的状态。当发生这种情况时,请尝试,kill -9 pid
这可能会彻底终止它。
在这种情况下,已停止运行的进程(31217)将无法被终止,但其父进程(31216)应该终止,并带走其子进程。
答案2
来自男人页:
kill 命令向指定进程或进程组发送指定信号。如果未指定信号,则发送 TERM 信号。TERM 信号将杀死未捕获此信号的进程。对于其他进程,可能需要使用 KILL (9) 信号,因为无法捕获此信号。
在 Unix 和类 Unix 计算机操作系统上,僵尸进程或已停止运行的进程是已完成执行但仍在进程表中有一个条目的进程。仍需要此条目以允许启动(现在的僵尸)进程的进程读取其退出状态。术语“僵尸进程”源于僵尸的常见定义 - 不死之人。在该术语的比喻中,子进程已“死亡”但尚未“被收割”。此外,与正常进程不同,kill 命令对僵尸进程不起作用。
来源 :维基百科
编辑:
到消除系统中的僵尸, SIGCHLD 信号可以使用 kill 命令手动发送给父进程。如果父进程仍然拒绝收割僵尸进程,下一步就是删除父进程。当进程失去父进程时,init 将成为其新的父进程。Init 会定期执行 wait 系统调用来收割以 init 为父进程的任何僵尸进程。
来源 :维基百科
答案3
当前处于不可中断系统调用(例如正在运行内核代码)的进程无法被终止。您可以使用 strace 或类似工具来找出它的位置,以便尝试将其取消。