这篇文章值得一读:
\n\n\n僵尸基本上是死进程的剩余部分,尚未被正确清理。创建僵尸进程的程序\nisn\xe2\x80\x99t 正确编程\xe2\x80\x93 程序\xe2\x80\x99t 不应该让僵尸\n进程继续存在。
\n
要了解僵尸进程是什么以及导致僵尸进程出现的原因,您\xe2\x80\x99需要了解一些有关进程在Linux上如何工作的信息。
\n当一个进程在Linux上死亡时,它并不会立即从内存中删除xe2x80x94,它的进程描述符仍然保留在内存中(进程描述符只占用很少的内存)。process\xe2\x80\x99s 状态变为 EXIT_ZOMBIE,并且 process\xe2\x80\x99s 父进程收到 SIGCHLD 信号通知其子进程已死亡。然后父进程应该执行wait()系统调用来读取死进程\xe2\x80\x99s的退出状态和其他信息。这允许父进程从死亡进程获取信息。调用 wait() 后,僵尸进程就会从内存中完全删除。
\n这通常发生得非常快,因此您不会\xe2\x80\x99看到僵尸进程在系统上累积。但是,如果父进程没有正确编程并且从不调用 wait(),则其僵尸子进程将保留在内存中,直到它们被清理干净。
\nGNOME 系统监视器、top 命令和 ps 命令等实用程序显示僵尸进程。
\n僵尸进程不会占用任何系统资源。(实际上,每个僵尸进程都使用非常少量的系统内存来存储其进程描述符。)但是,每个僵尸进程都保留其进程 ID (PID)。Linux 系统在 32 位系统上默认具有有限数量的进程 ID \xe2\x80\x93 32767。例如,如果僵尸进程以非常快的速度积累 \xe2\x80\x93,如果编程不当的服务器软件在负载下创建僵尸进程 \xe2\x80\x94,则整个可用 PID 池最终将分配给僵尸进程,从而阻止其他进程启动。
\n然而,一些挂起的僵尸进程没有问题\xe2\x80\x93,尽管它们确实表明系统上的父进程存在错误。
\n您可以 \xe2\x80\x99t 杀死僵尸进程,因为您可以使用 SIGKILL 信号杀死正常进程 \xe2\x80\x94 僵尸进程已经死亡。请记住,\xe2\x80\x99 不需要摆脱僵尸进程,除非你的系统上有大量\xe2\x80\x93 一些僵尸进程是无害的。但是,有几种方法可以消除僵尸进程。
\n一种方法是向父进程发送 SIGCHLD 信号。该信号告诉父进程执行 wait() 系统调用并清理其僵尸子进程。使用kill命令发送信号,将下面命令中的pid替换为父进程\xe2\x80\x99s PID:
\nkill -s SIGCHLD pid\nRun Code Online (Sandbox Code Playgroud)\n但是,如果父进程未正确编程并且忽略 SIGCHLD 信号,则这不会有帮助。您\xe2\x80\x99必须杀死或关闭僵尸\xe2\x80\x99父进程。当创建僵尸进程结束时,init 继承僵尸进程并成为它们的新父进程。(init 是 Linux 上启动时启动的第一个进程,分配的 PID 为 1。) init 定期执行 wait() 系统调用来清理其僵尸子进程,因此 init 可以快速处理僵尸进程。关闭父进程后可以重新启动它。
\n如果父进程继续创建僵尸进程,则应对其进行修复,以便它正确调用 wait() 来获取其僵尸子进程。如果系统上的程序不断创建僵尸程序,请提交错误报告。
\n| 归档时间: |
|
| 查看次数: |
1074 次 |
| 最近记录: |