我正在编写一个插件,以便在您访问网站时自动突出显示文本字符串.这就像突出显示搜索结果,但自动和许多单词; 它可以用于过敏的人,使单词真正脱颖而出,例如,当他们浏览食物网站时.
但我有问题.当我尝试关闭一个空的,新鲜的FF窗口时,它会以某种方式阻止整个过程.当我终止进程时,所有窗口都消失了,但Firefox进程保持活动状态(父PID为1,不监听任何信号,打开大量资源,仍然占用CPU,但不会让步).
所以有两个问题:
如何一个进程不听kill -9(既不是用户也不是root用户)怎么可能?
除了重启之外,有什么我可以做的吗?
[编辑]这是违规的过程:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND digulla 16688 4.3 4.2 784476 345464 pts/14 D Mar28 75:02 /opt/firefox-3.0/firefox-bin
与...相同 ps -ef | grep firefox
UID PID PPID C STIME TTY TIME CMD digulla 16688 1 4 Mar28 pts/14 01:15:02 /opt/firefox-3.0/firefox-bin
这是剩下的唯一过程.正如你所看到的,它不是一个僵尸,它正在运行!它不会听杀-9,无论我是用PID还是名字杀了!如果我尝试连接strace
,那么strace
也挂起并且不能被杀死.也没有输出.我的猜测是FF挂起了一些内核例程但是哪个?
[EDIT2]根据sigjuice的反馈:
ps axopid,comm,wchan
可以向您显示进程挂起的内核例程.就我而言,有问题的插件是Beagle Indexer(openSUSE 11.1).禁用插件后,FF又是一只快速而快乐的狐狸.
如对OP的评论中所述,进程状态(STAT
)D
表示进程处于"不间断睡眠"状态.在现实世界中,这通常意味着它在等待I/O并且不会/不会做任何事情 - 包括死亡 - 直到I/O操作完成.
D
状态中的进程通常仅在操作完成之前的几分之一秒内返回到R
/ S
.根据我的经验,如果一个进程陷入困境D
,它通常会尝试与无法访问的NFS或其他远程文件系统进行通信,尝试访问失败的硬盘驱动器,或通过片状设备驱动程序使用某些硬件.在这种情况下,恢复并允许进程死亡的唯一方法是让fs/drive/hardware备份并运行,以便I/O可以完成或放弃并重启系统.在NFS的特定情况下,安装也可能最终超时并从I/O操作返回(带有故障代码),但这取决于安装选项,并且将NFS安装设置为永久等待是很常见的.
这与僵尸进程截然不同,僵尸进程的状态为Z
.
仔细检查parent-id是否为1.如果不是firefox
,那么首先尝试sudo killall -9 firefox-bin
.之后,尝试单独删除特定进程ID sudo killall -9 [process-id]
.
一个进程不能监听kill -9(用户还是root用户)怎么可能?
如果进程已经消失
,然后成为父级为1 的僵尸,则无法手动终止它; 只能init
.僵尸进程已经死亡并且已经消失 - 它们已经失去了被杀的能力,因为它们不再是进程,只有进程表条目及其相关的退出代码,等待收集.你需要杀死父母,你不能init
因为明显的原因而杀人.
但请参阅此处获取更多一般信息.重启会自然会杀死一切.