如何杀死其父级为init的<defunct>进程?


27

传输间歇性地挂在我的NAS上。如果我发送SIGTERM,它不会从进程列表中消失,并且<defunct>它旁边会出现一个标签。如果我发送SIGKILL,它仍然不会消失并且我不能终止父级,因为父级是init。我摆脱进程并重新启动传输的唯一方法是重新启动。

我意识到我能做的最好的事情就是尝试修复Transmission(而且我已经尝试过),但是我是编译的新手,我想确保自己的洪流在开始处理之前就完成了。


3
没有人能说出明显的话……“ init”拥有的<defunct>进程应该是不可能的!这是一个非常奇怪的情况!你确定吗?
JoelFan 2011年

@JoelFan:我只是在寻找,以确保我没有忘记重要的事情。属于孩子的僵尸init应该很快消失,因为init作为许多常见任务之一,定期等待孩子是... <defunct>与僵尸一样吗?
D.Shawley

1
没关系…… <defunct>与僵尸完全一样。init将等待它的孩子,所以这在理论上永远不会发生。我想知道如果发送SIGCHLD到会发生什么init
D.Shawley 2011年

@JoelFan:是的,我确定。PPID的值为1(初始值),因此无法对该进程进行SIGKILL。
Andy E

Answers:


35

您无法杀死<defunct>已死的进程(也称为僵尸进程)。系统保留僵尸进程以供父级收集退出状态。如果父母没有收集退出状态,那么僵尸进程将永远存在。摆脱僵尸进程的唯一方法是杀死父进程。如果父级是init,则只能重新启动。

僵尸进程几乎不占用资源,因此让它们流连忘返没有性能成本。尽管僵尸进程通常意味着您的某些程序中存在错误。初始化通常应收集所有孩子。如果init有僵尸孩子,则init中存在错误(或其他错误,但它是错误)。

http://en.wikipedia.org/wiki/Zombie_process


9
init永远不会有僵尸孩子。摘自Wikipedia文章:当进程失去其父级时,init会成为其新的父级。Init定期执行wait系统调用,以将init作为父级的所有僵尸都收割。 其中一个init的职责是收获的孤儿和父母双亡的僵尸。
D.Shawley

14
@ D.Shawley:init虽然可能有错误。初始化替换runit有一个导致此问题的错误。
camh 2011年

2
init可能有已失效的子级,可能是由于bug所致,但这确实可以。因为我现在正在看一个。
studgeek'5

有一个我从终端运行并进入已失效状态的程序。如@lesmana所述,当我关闭终端(父)时,程序干净退出。
mk..17

6

任何试图修复Transmission C源代码的人都应该阅读“双叉”技巧,以避免僵尸和信号处理程序……以及如何将其用作智能可变参数生成函数的一部分(请参见Unix中的Spawning)。

excerpt from: 
   "Spawning in Unix", http://lubutu.com/code/spawning-in-unix

Double fork
This trick lets you spawn processes whilst avoiding zombies, without 
installing any signal handler. The first process forks and waits for its 
child; the second process forks and immediately exits and is reaped;
the third process is adopted by init, and executes the desired program. 
All zombies accounted for, since init is always waiting.

if(fork() == 0) {
   if(fork() == 0) {
       execvp(file, argv);
       exit(EXIT_FAILURE);
   }
   exit(EXIT_SUCCESS);
}
wait(NULL);

1
双叉通过强制内核将其父代设置为PID 1来防止僵尸进程,该进程应该清理僵尸。这听起来像传输已经这样做了,因为其父是已处理1
JANDER

1
这里有多个问题。#1:只有父母可以打电话exit(3);孩子们应该打电话给_exit(2)他们(否则,您会收到多次同花顺冲洗)。#2:如果失败,execvp(3)可以使用a perror(3)。#3:您应该使用signal(SIGCHLD, SIG_IGN)而不是整个混乱。
凯文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.