我遇到了僵尸进程问题。
我读什么是 <defunct> 进程,为什么它不会被终止?意思是
除非有很多这样的进程,否则让这些进程继续运行也没什么坏处。僵尸进程最终会被其父进程收割(通过调用 wait(2))。如果原始父进程在其退出之前没有收割它,那么 init 进程(pid == 1)会在稍后的某个时间收割它。
我不明白这一点。
这是否意味着僵尸进程的条目最终将从进程表中删除并被 init 进程成功杀死(Pid = 1
)?
我认为僵尸进程会导致内存短缺问题,因为它们不会返回分配的内存空间。
我对吗?
答案1
僵尸进程不会占用任何系统资源。(实际上,每个进程都使用极少量的系统内存来存储其进程描述符。)但是,每个僵尸进程都会保留其进程 ID (PID)
Linux 系统的进程 ID 数量是有限的,在 32 位系统上默认为 32767。如果僵尸进程以极快的速度累积,例如,如果编程不当的服务器软件在负载下创建僵尸进程,则整个可用 PID 池最终将分配给僵尸进程,从而阻止其他进程启动。
摆脱僵尸进程
kill -s SIGCHLD pid
致谢:高温热电偶
答案2
不,实际上僵尸进程是
在 UNIX 系统术语中,已终止但其父进程尚未等待它的进程称为僵尸进程。ps(1) 命令将僵尸进程的状态打印为 Z。如果我们编写一个长期运行的程序,该程序分叉出许多子进程,除非我们等待它们并获取它们的终止状态,否则它们将成为僵尸进程。
最后要考虑的情况是:当 init 继承的进程终止时会发生什么?它会变成僵尸进程吗?答案是“不会”,因为 init 的编写方式是,每当它的一个子进程终止时,init 都会调用其中一个等待函数来获取终止状态。通过这样做,init 可以防止系统被僵尸进程阻塞。当我们说“init 的一个子进程”时,我们指的是 init 直接生成的进程(例如 getty,我们将在 9.2 节中描述)或其父进程已终止并随后被 init 继承的进程。 摘自 stevence rechard 撰写的《Advance unix Programming》