var*_*tec 21
僵尸进程(实际上现在被称为<defunct>
)并不是真正的进程。它只是进程表中的条目,因此父进程可以执行wait()
syscall。
你不应该担心他们。它们不占用任何资源,它们也会wait()
在父母死亡时它们的父母调用它们而消失。
小智 18
天啊!不不不。不要使用kill -9。
它没有给进程一个干净的机会:
关闭套接字连接
清理临时文件
通知它的孩子它正在消失
重置其终端特性等等等等。
通常,发送 15,然后等待一两秒钟,如果这不起作用,则发送 2,如果不起作用,则发送 1。如果没有,请删除二进制文件,因为该程序表现不佳!
不要使用kill -9。不要为了整理花盆而拿出联合收割机。
小智 14
然而,已经有一个公认的答案:你可以杀死僵尸进程。将调试器附加到父进程并调用 waitpid 函数。例如: - 让我们假设父进程的 PID=100,僵尸进程的 PID=200
$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
Run Code Online (Sandbox Code Playgroud)
除了进程树中的条目之外,僵尸进程没有任何资源分配给它。当一个进程完成时会发生这种情况,但是父进程还没有收割它(即,对其进行wait
编辑)。
如果您愿意,您可以通过向父级发送 SIGCHLD ( kill -20
)来尝试强制父级执行此操作,但不能保证父级会尊重它。
您经常会在短时间内看到它们(例如,在使用 top 查看进程树时)——这是正常的;在子进程完成与父进程轮询之间的时间片中 - 子进程将显示为僵尸进程。
但是,如果您看到僵尸进程持续存在——这是不正常的——仍然没有必要担心——同样因为没有分配给死进程的资源——这通常意味着应用程序是由蹩脚的开发人员编写的。
您唯一应该关注僵尸进程的时候,是当您看到大量僵尸进程时,例如,如果上述相同的蹩脚应用程序处于负载状态。
我工作的地方有很多糟糕的开发人员,所以我有幸处理这些问题并在这样做的同时学习各种无用的东西。事实上 - 我的团队经常在面试中使用由蹩脚的开发人员编写的蹩脚的 shell 脚本 - 如果应聘者可以选择该脚本确实是蹩脚的,并告诉我们它为什么蹩脚,那么他就有了很好的立足点。
归档时间: |
|
查看次数: |
40652 次 |
最近记录: |