Como matar / rm pipe apenas pelo número de inode?

0

EDIT: Eu originalmente cortar e colei uma pergunta que eu perguntei anteriormente stackoverflow que foi fechado: link

Eu já enfrentei o mesmo problema com um processo diferente e agora editei minha pergunta para esse processo (o novo pid é 23758).

O processo parece estar na espera do disco:

> 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" retorna muitas linhas, mas as "interessantes" parecem ser:

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

Embora "lsof -p" não mostre, bc-xwd.pl acessa / mnt / sshfs, um Sistema de arquivos montado em loop de somente leitura HFS que tem uma tendência a travar de vez em quando. Quando ele falha, eu recebo várias mensagens do console que se parece com isso:

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

(e vários mais).

Geralmente , os processos que o acessam simplesmente morrem, mas alguns penduram como acima. Remontar o sistema de arquivos não ajuda.

Eu fiz isso (no bash) para atingi-lo com todos os sinais de kill possíveis:

perl -le 'for (@ARGV) {print "kill -$_ 23758"}' 'kill -l' | sh

mas ainda vive. Eu fiz a mesma coisa tcsh (substituindo "| sh" por "| tcsh") com a mesma falta de resultados.

Eu também observei todos os arquivos em / proc / 23758 fazendo isso:

find /proc/23758 -type f | perl -nle 'print "$_:";system("cat $_");'

mas houve muitos resultados e não sei quantos foram realmente importante. Se houver algum arquivo específico, seria útil para postar, por favor, deixe-me saber e eu vou.

Por que isso é importante: minha CPU parece ser muito mais lenta, já que processo começou a ficar suspenso (já faz alguns dias). Última vez isso aconteceu, eu reiniciei, e tudo estava bem, mas eu estou esperando evitar uma reinicialização desta vez.

Pergunta original abaixo:

Eu tenho vários processos (alguns canalizados uns com os outros) que até matam -9 não matam. Quando eu corro lsof -p em um deles, vejo várias linhas, uma das quais diz:

COMMAND  PID USER FD   TYPE DEVICE SIZE/OFF     NODE NAME
convert 9859 barrycar    0r  FIFO    0,6      0t0 74488298 pipe

Tenho certeza de que este é o problema: os processos abriram pipes para se comunicarem entre si em um dispositivo que travou (o qual eu mais tarde remontei apenas com um arquivo / dev / device diferente).

Eu acho que se eu puder destruir o pipe com o inode 74488298, os dois processos ligados por este pipe (que obviamente tem outro número de inode para o segundo processo) morrerão.

Então, como posso fazer isso e / ou qual sinal de kill posso enviar para o processo que diz "seus canos estão quebrados, desistam e morram"? Eu tentei POLL, TRAP, HUP, (e, claro, matar -KILL aka kill -9) sem sucesso.

    
por barrycarter 26.10.2015 / 17:46

1 resposta

0

Se kill -9 não funcionar, o processo poderá ficar permanentemente encravado. Você pode esperar e ver se algo expira, e você pode ser capaz de soltar algo descarregando módulos do kernel ou desconectando dispositivos, mas provavelmente você só precisa ignorá-los até a próxima reinicialização.

A boa notícia é que um processo nesse estado quase certamente não usa recursos da CPU e, mais cedo ou mais tarde, sua memória pode ser movida para swap.

    
por 26.10.2015 / 18:46

Tags