如何与父级1终止<defunct>进程


17

我正在RedHat盒子上运行Bacula。存储守护程序bacula-sd有时会停止工作并变为<defunct>

[root@backup ~]# ps -ef | grep defunct | more
root      4801 29261  0 09:25 pts/5    00:00:00 grep defunct
root      5825     1  0 Oct18 ?        00:00:00 [bacula-sd] <defunct>

我的问题是,我该如何杀死这个过程?据我所知,它的父级是1,它是init,我不想终止init进程,对吗?

“通常”杀死该进程不起作用:

[root@backup ~]# kill -0 5825
[root@backup ~]# kill -9 5825

非常感谢您的帮助!

编辑:运行

[root@backup ~]# lsof -p 5825

产生以下输出:

COMMAND    PID USER   FD   TYPE  DEVICE     SIZE    NODE NAME
bacula-sd 5825 root  cwd    DIR   253,0     4096 3801089 /root
bacula-sd 5825 root  rtd    DIR   253,0     4096       2 /
bacula-sd 5825 root  txt    REG   253,0  2110599  368004 /usr/local/sbin/bacula-sd
bacula-sd 5825 root  mem    REG   253,0    75284  389867 /usr/lib/libz.so.1.2.3
bacula-sd 5825 root  mem    REG   253,0    46680 3604521 /lib/libnss_files-2.5.so
bacula-sd 5825 root  mem    REG   253,0   936908  369115 /usr/lib/libstdc++.so.6.0.8
bacula-sd 5825 root  mem    REG   253,0   125736 3606807 /lib/ld-2.5.so
bacula-sd 5825 root  mem    REG   253,0  1602128 3606885 /lib/libc-2.5.so
bacula-sd 5825 root  mem    REG   253,0   208352 3606892 /lib/libm-2.5.so
bacula-sd 5825 root  mem    REG   253,0   125744 3606887 /lib/libpthread-2.5.so
bacula-sd 5825 root  mem    REG   253,0    25940 3604573 /lib/libacl.so.1.1.0
bacula-sd 5825 root  mem    REG   253,0    15972 3604535 /lib/libattr.so.1.1.0
bacula-sd 5825 root  mem    REG   253,0    46548 3606908 /lib/libgcc_s-4.1.2-20080102.so.1
bacula-sd 5825 root  mem    REG   253,0 56422480  366368 /usr/lib/locale/locale-archive
bacula-sd 5825 root    0r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    1r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    2r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    3u   CHR   9,128             6469 /dev/nst0
bacula-sd 5825 root    4u  IPv4 1023380              TCP backup:bacula-sd (LISTEN)
bacula-sd 5825 root    5u  IPv4 2693268              TCP backup:bacula-sd->backup:53957 (CLOSE_WAIT)
bacula-sd 5825 root    7u  IPv4 3248683              TCP backup:bacula-sd->backup:57629 (CLOSE_WAIT)
bacula-sd 5825 root    8u  IPv4 3250966              TCP backup:bacula-sd->backup:37650 (CLOSE_WAIT)
bacula-sd 5825 root    9u  IPv4 3253908              TCP backup:bacula-sd->backup:37671 (CLOSE_WAIT)

Answers:


18

删除僵尸/已终止进程的唯一方法是杀死父进程。由于父级是init(pid 1),这也将导致系统崩溃。

这几乎给您留下了两个选择。

  • 手动修改过程表,例如。创建一个虚拟进程,将已失效的进程链接为虚拟进程的子进程,然后将其杀死。非常危险,您可能必须手动清理其他进程资源,例如信号量和文件句柄。
  • 重新启动系统。

我会选择第二个。


2
+1。但是,只要没有出现更多的僵尸进程,或者您的僵尸进程没有锁定4G RAM,就不必着急。:)
凯尔·史密斯

1
“由于父级是init(pid 1),这也将导致您的系统崩溃”-您无法杀死init它,因为它没有SIGKILL的信号处理程序。请参阅man 2 kill
Cawflands

你如何做的第一?
skerit 2014年

@AndrewH我不确定SIGKILL是否在目标进程中依赖于信号处理程序,但是确实,典型的内核会忽略SIGKILL进行初始化。但是,如果您用较冷的方法触发内核恐慌,我想您会发现在大多数Linux系统上,SIGSEGV会做的很好。
罗伊

1
应当指出,init的工作之一是收获僵尸进程,因此,如果等待时间足够长,init应清理僵尸进程。虽然,大多数inits应该将的处理程序设置SIGCHLD为可以SIG_IGN 解决此问题。
cyphar 2015年

3

您可以尝试重新启动init:

 # telinit u

否则,我不会太担心。它没有运行,也没有占用任何资源,它就在那里,因此内核可以记住它。


1
好吧,我有点担心。这是一台运行备份(bacula)和voip(星号)服务的生产机器。只要存在已失效的bacula-sd过程,bacula似乎就无法访问磁带机...
andreas-h 2009年

它不应该打开任何文件。运行lsof -p 5825并检查。
大卫·帕什利

好吧,似乎有很多事情可以打开……见上文。有什么想法我能做什么?我从没使用过lsof ...
andreas-h 09-10-20

1
是的,您的僵尸已打开/ dev / nst0。此时重启系统可能是最好的选择。
凯尔·史密斯

5
是的,重启似乎是普遍的答案。我总是觉得我必须重新启动服务器时失败了。:(
David Pashley,09年


3

如果僵尸将init作为其父对象,则init已停止正常工作。init的作用之一是清理僵尸。如果不这样做,没有其他人会这样做。因此,唯一的解决方案是重新启动。如果init损坏,则重新启动可能会失败,因此我将关闭重要服务,同步文件系统,然后单击电源按钮。


我同意init无法正常工作。另请参阅:upstartsystemd
米科·兰塔莱宁

2

让我们保持恐慌吧?“已失效”或“僵尸”进程不是一个进程。它只是过程表中的一个条目,带有保存的退出代码。因此,僵尸程序不是进程它不占用资源,不占用CPU周期并且不使用内存。。不要试图“杀死”僵尸进程而感到奇怪和发痒。就像他们的名字一样,他们已经死了,因此无法被杀死。但是,与吃食大脑的人不同,它们绝对不会伤害任何人,也不会咬人其他过程。

不要让僵尸进程吞噬您的大脑。只是忽略它们。


11
是的,那是理论。不幸的是,并非总是如此。无效的过程有时会挂在系统资源上,就像andreash清楚地记录在案。
罗伊

5
在他的情况下,按照lsof的输出,僵尸进程正在吞噬/ dev / nst0的大脑。他需要那些大脑来继续备份操作。
凯尔·史密斯

2
花费大量时间无视僵尸进程的系统管理员最终将在半夜醒来,他们的生命被淘汰。根据我的经验,僵尸表明存在问题。我什至在僵尸孩子与父级有某种奇怪的交互,而父级正在旋转我的CPU的情况下也编写这些代码。我不知道这是谁的错,但重点是僵尸很丑陋,无视它们将会有一天困扰着您。……有一天……当你在半夜里安睡……在寒冷的秋日之后……
Mike S

@MikeS您的评论让我很开心!
Paul Calabro

@MikeS有权利。我的ssh-agent已失效,ssh或git也无法正常运行。只有重新启动才能提供帮助。(与Windows相同的修复方法……哈哈)
约翰·崔比

0

好像您有一个孤立的过程。据我所知,杀死它们的唯一方法是重启盒子。我已经不时在我的ESX服务器(引擎盖下的Linux)上发生这种情况,并且主机重新启动是修复程序(来自VMware支持)。

我是Windows专家,所以以它的价值为准。


不幸的是,重启不是一个现实的选择。这是一台同时运行voip服务的生产机器,所以我无法在办公时间内重新启动它…
andreas-h,2009年

1
因此,您可以在办公时间后重新启动,对吗?
沃伦
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.