编辑:我最初剪切并粘贴了一个我之前在 stackoverflow 上问过的问题,该问题已被关闭: https://stackoverflow.com/questions/32622224/how-to-kill-pipe-by-inode-number-only
我现在在不同的进程中遇到了同样的问题,并且已经针对该进程编辑了我的问题(新的 pid 是 23758)。
该进程似乎处于磁盘等待状态:
> ps -wwwlp 23758
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 D 500 23758 1 0 80 0 - 3651 lookup ? 00:00:00 bc-xwd.pl
“lsof -p 23758”返回很多行,但“有趣”的行似乎是:
bc-xwd.pl 23758 barrycar 0r FIFO 0,6 0t0 82208417 pipe
bc-xwd.pl 23758 barrycar 1w CHR 1,3 0t0 620 /dev/null
bc-xwd.pl 23758 barrycar 2w CHR 1,3 0t0 620 /dev/null
尽管“lsof -p”没有显示出来,bc-xwd.pl 可以访问 /mnt/sshfs,这是一个 HFS 只读循环挂载文件系统,它时常会崩溃。当它崩溃时,我会收到几条控制台消息,如下所示:
Message from syslogd@domain at Oct 24 05:54:32 ...
kernel: [<c0408474>] ? sysenter_do_call+0x12/0x28
Message from syslogd@domain at Oct 24 05:54:32 ...
kernel:Code: 8b 44 10 2c e8 84 10 de ff 8b 83 a0 00 00 00 0f b7 50 04 39 d6 7c e5 8b 93 a0 00 00 00 8b 42 18 85 c0 74 16 c7 42 18 00 00 00 00 <8b> 30 e8 bf fc ff ff 85 f6 74 04 89 f0 eb f1 8b 83 a4 00 00 00
Message from syslogd@domain at Oct 24 05:54:32 ...
kernel:EIP: [<c06af6b0>] skb_release_data+0x78/0x96 SS:ESP 0068:df021da8
(还有其他一些)。
通常,访问它的进程会直接死掉,但有些进程会像上面一样挂起。重新安装文件系统也无济于事。
我这样做了(在 bash 中),用所有可能的终止信号来攻击它:
perl -le 'for (@ARGV) {print "kill -$_ 23758"}' `kill -l` | sh
但它仍然存在。我对 tcsh 做了同样的事情(将“| sh”替换为“| tcsh”),但同样没有结果。
我还通过以下方式查看了 /proc/23758 中的所有文件:
find /proc/23758 -type f | perl -nle 'print "$_:";system("cat $_");'
但结果很多,我不确定有多少是真正重要的。如果有任何特定的文件需要发布,请告诉我,我会的。
为什么这很重要:自从这个过程开始挂起以来,我的 CPU 似乎慢了很多(现在已经过了几天)。上次发生这种情况时,我重新启动了,一切都很好,但我希望这次可以避免重新启动。
原始问题如下:
我有几个进程(有些通过管道连接到其他进程),甚至 kill -9 也无法终止它们。当我对其中一个进程运行 lsof -p 时,我看到几行,其中一行内容如下:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
convert 9859 barrycar 0r FIFO 0,6 0t0 74488298 pipe
我很确定这就是问题所在:进程在崩溃的设备上打开管道来相互通信(我后来使用不同的 /dev/ 设备文件以只读方式重新挂载该设备)。
我认为如果我可以销毁 inode 为 74488298 的管道,则由该管道链接的两个进程(当然,第二个进程有另一个 inode 号)将会死亡。
那么,我该怎么做呢?或者我可以向进程发送什么终止信号,表示“您的管道已损坏,放弃并终止”?我尝试过 POLL、TRAP、HUP(当然还有 kill -KILL 又名 kill -9),但无济于事。
答案1
如果kill -9
不起作用,则该过程可能会被永久卡住。您可以等待并查看是否有超时,并且您可能能够通过卸载内核模块或拔下设备来解除某些卡住,但可能您只需忽略它们,直到下次重新启动。
好消息是,处于这种状态的进程几乎肯定不会使用任何 CPU 资源,并且它的内存迟早会被转移到交换区。