虚拟霰弹枪?
答案1
哦天哪!不不不。不要使用 kill -9。
它没有给这个过程一个机会来清理:
关闭套接字连接
清理临时文件
通知其子进程它要离开了
重置其终端特性等等。
一般来说,发送 15,然后等待一两秒,如果不行,就发送 2,如果还不行,就发送 1。如果还不行,就删除该二进制文件,因为程序行为很糟糕!
不要使用kill -9。不要为了整理花盆而开出联合收割机。
答案2
僵尸进程(实际上现在它们被称为<defunct>
)并不是真正的进程。它只是进程表中的条目,因此父进程可以执行wait()
系统调用。
你不必担心它们。它们不占用任何资源,当它们的父进程调用时它们就会消失,或者wait()
父进程本身死亡时它们也会消失。
答案3
但是,已经有一个公认的答案:您可以杀死僵尸进程。使用调试器连接到父进程并调用 waitpid 函数。例如:- 假设父进程的 PID=100,僵尸进程的 PID=200
$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
答案4
僵尸进程除了进程树中的条目外,没有分配给它任何资源。当进程完成但父进程尚未完成时,就会发生这种情况收割它,(即,wait
对其进行编辑)。
如果您愿意,可以尝试强制父进程执行此操作,方法是向父进程发送 SIGCHLD ( kill -20
),但不能保证父进程一定会遵守该操作。
您经常会在短时间内看到它们(例如,在使用 top 查看进程树时) - 这是正常的;在子进程完成和父进程轮询它之间的时间片内 - 子进程将显示为僵尸。
但是,如果您看到僵尸进程持续存在 - 这并不正常 - 仍然没有必要担心 - 因为没有为死进程分配资源 - 这通常意味着该应用程序是由糟糕的开发人员编写的。
您唯一需要担心僵尸进程的时候是当您看到大量的僵尸进程时,例如当上面提到的相同的蹩脚应用程序处于负载之下时。
我工作的地方有很多糟糕的开发人员,所以我有幸处理这些问题,并在处理过程中学习各种无用的东西。事实上,我的团队经常在面试中使用我们糟糕的开发人员编写的糟糕 shell 脚本 - 如果候选人能挑出脚本确实很糟糕,并告诉我们为什么它很糟糕,那么他就有很大的机会进入面试。