我正在写一个插件,当你访问网站时,它会自动突出显示文本字符串。它类似于突出显示的搜索结果,但它是自动的,可以用于许多单词;它可以用于有过敏症的人,例如,当他们浏览食物网站时,使单词真正突出。
但我有个问题。当我试图关闭一个空的、新鲜的FF窗口时,它以某种方式阻塞了整个过程。当我杀死这个进程时,所有的窗口都消失了,但是Firefox进程仍然活着(父进程的PID是1,不监听任何信号,有大量的资源打开,仍然占用CPU,但不会改变)。
所以有两个问题:
编辑这是一个有问题的过程:
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
这是唯一剩下的过程。如你所见,它不是僵尸,它在跑!它不会听kill -9,不管我是按PID还是按名字杀死它!如果我尝试连接strace
,那么strace
也会挂起,并且不能被杀死。也没有输出。我的猜测是FF挂在某个内核例程中,但是是哪个呢?
基于sigjuice反馈的EDIT2:
ps axopid,comm,wchan
可以显示进程在哪个内核例程中挂起。在我的例子中,令人不快的插件是Beagle Indexer (openSUSE 11.1)。禁用插件后,FF再次成为一只敏捷而快乐的狐狸。
发布于 2009-03-31 14:07:48
正如在对OP的注释中所指出的,D
的进程状态(STAT
)指示进程处于“不可中断的睡眠”状态。在现实世界中,这通常意味着它在等待I/O,并且不能/不会做任何事情-包括死亡-直到I/O操作完成。
在操作完成并返回到R
/S
之前,处于D
状态的进程通常只会在那里停留一小部分时间。根据我的经验,如果一个进程卡在D
中,最常见的情况是它试图与无法访问的NFS或其他远程文件系统通信,试图访问出现故障的硬盘驱动器,或者通过不稳定的设备驱动程序使用某些硬件。在这种情况下,恢复并允许进程终止的唯一方法是重新启动和运行fs/驱动器/硬件,以便I/O可以完成,或者放弃并重新启动系统。在NFS的特定情况下,挂载也可能最终超时并从I/O操作返回(带有一个失败代码),但这取决于挂载选项,NFS挂载通常被设置为永远等待。
这与僵尸进程不同,僵尸进程的状态将为Z
。
发布于 2009-03-29 14:44:38
仔细检查parent-id是否真的是1。如果不是,这是firefox
,首先尝试sudo killall -9 firefox-bin
。在此之后,尝试使用sudo killall -9 [process-id]
逐个终止特定的进程ID。
进程怎么可能不监听kill -9 (neiter既不是用户也不是根用户)?
如果一个进程已经<defunct>
了,然后变成了一个父进程为1的,您不能手动终止它;只有init
可以。僵尸进程已经死了--它们已经失去了被杀死的能力,因为它们不再是进程,只有一个进程表条目及其相关的退出代码,等待被收集。你需要杀死父母,但你不能因为显而易见的原因而杀死init
。
但要了解更多一般信息,请参阅。重启自然会杀死所有东西。
发布于 2009-03-29 15:12:27
有没有可能,这个进程在你杀死它的时候就被重新启动了(例如由init重启)?
您可以很容易地检查这一点。如果PID在kill -9 PID
之后是相同的,则该进程没有被终止,但是如果它发生了变化,则该进程已被重启。
https://stackoverflow.com/questions/694720
复制相似问题