jldugger Asked: 2009-05-27 21:54:35 +0800 CST2009-05-27 21:54:35 +0800 CST 2009-05-27 21:54:35 +0800 CST 什么是僵尸进程,如何杀死它? 772 虚拟霰弹枪? unix job-control zombie 7 个回答 Voted vartec 2009-05-28T00:46:47+08:002009-05-28T00:46:47+08:00 僵尸进程(实际上现在它们被称为<defunct>)并不是一个真正的进程。它只是进程表中的条目,因此父进程可以执行wait()syscall。 你不应该担心他们。他们不占用任何资源,wait()当父母本身死亡时,他们会在父母打电话时消失。 Best Answer Severe_admin 2009-05-27T22:34:49+08:002009-05-27T22:34:49+08:00 天啊!不不不。不要使用 kill -9。 它没有给过程一个干净的机会: 关闭套接字连接 清理临时文件 通知它的孩子它正在消失 重置其终端特性等等等等。 通常,发送 15,然后等待一两秒钟,如果不起作用,发送 2,如果不起作用,发送 1。如果不起作用,请删除二进制文件,因为程序表现不佳! 不要使用 kill -9。不要为了收拾花盆而拿出联合收割机。 ondra 2010-01-12T05:28:30+08:002010-01-12T05:28:30+08:00 然而,已经有一个公认的答案:你可以杀死僵尸进程。将调试器附加到父进程并调用 waitpid 函数。例如: - 假设父进程的 PID=100,僵尸进程的 PID=200 $ gdb -p 100 (gdb) call waitpid(200, 0, 0) (gdb) quit nedm 2009-05-27T22:00:06+08:002009-05-27T22:00:06+08:00 这是一个已完全解除分配但仍存在于进程表中的进程。 将此与孤儿进程进行对比,其父进程已死亡但仍在执行。 这里 有一些 关于摆脱它们的建议。 Xerxes 2009-05-29T07:58:36+08:002009-05-29T07:58:36+08:00 僵尸进程除了进程树中的条目外,没有任何资源分配给它。这发生在进程完成时,但父进程尚未获得它(即,wait对其进行编辑)。 如果您愿意,您可以尝试通过向父级发送 SIGCHLD ( kill -20) 来强制父级执行此操作,但不能保证父级会遵守它。 您经常会在短时间内看到它们(例如,在使用 top 查看进程树时) - 这是正常的;在子进程完成和父进程轮询之间的时间片内 - 子进程将显示为僵尸。 但是,如果您看到持续存在的僵尸进程 - 这是不正常的 - 仍然无需担心 - 再次因为没有为死进程分配资源 - 这通常意味着应用程序由糟糕的开发人员编写得不好。 您唯一应该担心僵尸进程的时候是当您看到大量僵尸进程时,例如,如果上面提到的同一个蹩脚的应用程序处于负载状态。 我工作的地方有很多糟糕的开发人员,所以我有幸处理这些问题并在此过程中学习各种无用的东西。事实上——我的团队经常在面试中使用由糟糕的开发人员编写的糟糕的 shell 脚本——如果候选人可以选择脚本确实很糟糕,并告诉我们为什么它很糟糕,那么他就有了很好的选择。 drybjed 2009-06-02T04:33:48+08:002009-06-02T04:33:48+08:00 至于虚拟霰弹枪…… $ 拍摄 <pid> #!/bin/sh 受害者=`ps -e -o pid,ppid | egrep "^\s*$1\b" | awk '{打印 $2}'` 受害者\_name=`ps -e -o pid,cmd | egrep "^\s*${受害者}\b" | 头-n 1 | awk '{打印 $2}'` #kill ${受害者} echo "杀死了 ${victim_name}。" 请记住:始终朝他们的头部开枪。 Alan 2009-05-27T21:58:40+08:002009-05-27T21:58:40+08:00 僵尸进程是已经执行完毕,但仍列在进程表中的进程。 kill -9 [parent process_name]会放下它,带着极端的偏见。
僵尸进程(实际上现在它们被称为
<defunct>
)并不是一个真正的进程。它只是进程表中的条目,因此父进程可以执行wait()
syscall。你不应该担心他们。他们不占用任何资源,
wait()
当父母本身死亡时,他们会在父母打电话时消失。天啊!不不不。不要使用 kill -9。
它没有给过程一个干净的机会:
关闭套接字连接
清理临时文件
通知它的孩子它正在消失
重置其终端特性等等等等。
通常,发送 15,然后等待一两秒钟,如果不起作用,发送 2,如果不起作用,发送 1。如果不起作用,请删除二进制文件,因为程序表现不佳!
不要使用 kill -9。不要为了收拾花盆而拿出联合收割机。
然而,已经有一个公认的答案:你可以杀死僵尸进程。将调试器附加到父进程并调用 waitpid 函数。例如: - 假设父进程的 PID=100,僵尸进程的 PID=200
这是一个已完全解除分配但仍存在于进程表中的进程。 将此与孤儿进程进行对比,其父进程已死亡但仍在执行。
这里 有一些 关于摆脱它们的建议。
僵尸进程除了进程树中的条目外,没有任何资源分配给它。这发生在进程完成时,但父进程尚未获得它(即,
wait
对其进行编辑)。如果您愿意,您可以尝试通过向父级发送 SIGCHLD (
kill -20
) 来强制父级执行此操作,但不能保证父级会遵守它。您经常会在短时间内看到它们(例如,在使用 top 查看进程树时) - 这是正常的;在子进程完成和父进程轮询之间的时间片内 - 子进程将显示为僵尸。
但是,如果您看到持续存在的僵尸进程 - 这是不正常的 - 仍然无需担心 - 再次因为没有为死进程分配资源 - 这通常意味着应用程序由糟糕的开发人员编写得不好。
您唯一应该担心僵尸进程的时候是当您看到大量僵尸进程时,例如,如果上面提到的同一个蹩脚的应用程序处于负载状态。
我工作的地方有很多糟糕的开发人员,所以我有幸处理这些问题并在此过程中学习各种无用的东西。事实上——我的团队经常在面试中使用由糟糕的开发人员编写的糟糕的 shell 脚本——如果候选人可以选择脚本确实很糟糕,并告诉我们为什么它很糟糕,那么他就有了很好的选择。
至于虚拟霰弹枪……
请记住:始终朝他们的头部开枪。
僵尸进程是已经执行完毕,但仍列在进程表中的进程。
kill -9 [parent process_name]会放下它,带着极端的偏见。