如何仅通过 inode 号来 kill/rm 管道?

如何仅通过 inode 号来 kill/rm 管道?

编辑:我最初剪切并粘贴了一个我之前在 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 资源,并且它的内存迟早会被转移到交换区。

相关内容