Não é possível matar um processo adormecido

13

Não pareço capaz de matar -9 um processo que está em um estado de suspensão (S) interrompível:

[root@jupiter ~]# ps -elf | grep yum
4 S root     16790     1  0  75   0 - 73779 -      Jan15 ?        00:00:04 /usr/bin/python /usr/bin/yum -y install python-pip
[root@jupiter ~]# kill -9 16790
[root@jupiter ~]# ps -elf | grep yum
4 S root     16790     1  0  75   0 - 73779 -      Jan15 ?        00:00:04 /usr/bin/python /usr/bin/yum -y install python-pip

Como isso é possível? Existe alguma maneira de matar o processo sem reiniciar?

BOUNTY: Estou realmente mais interessado em uma explicação de como isso é possível.

UPDATE: Esta é a saída de lsof:

[root @ jupiter ~] # lsof -p 16790
COMANDO PID USUÁRIO FD TIPO DISPOSITIVO TAMANHO / DESLIGADO NOME DO NÓ
yum 16790 cwd raiz DIR 1166,56842 4096 16886249 / home / del
yum 16790 root rtd DIR 253,0 4096 2 /
yum 16790 txt raiz REG 253,0 8304 336177337 / usr / bin / python
yum 16790 REG raiz mem 253,0 144776 346128569 /lib64/ld-2.5.so
yum 16790 REG raiz mem 253,0 1718232 346128573 /lib64/libc-2.5.so
yum 16790 mem REG raiz 253,0 23360 346128599 /lib64/libdl-2.5.so
yum 16790 mem REG raiz 253,0 145872 346128584 /lib64/libpthread-2.5.so
yum 16790 REG raiz mem 253,0 615136 346128602 /lib64/libm-2.5.so
yum 16790 root mem REG 253,0 1244792 336171087 /usr/lib64/libpython2.4.so.1.0
yum 16790 mem REG raiz 253,0 95464 346128744 /lib64/libselinux.so.1
yum 16790 REG raiz mem 253,0 53448 346128750 /lib64/librt-2.5.so
yum 16790 mem REG raiz 253,0 13960 336187564 /usr/lib64/libplds4.so
yum 16790 REG raiz mem 253,0 58400 346128752 /lib64/libgcc_s-4.1.2-20080825.so.1
yum 16790 mem REG raiz 253,0 78384 336173796 /usr/lib64/libelf-0.137.so
yum 16790 REG raiz mem 253,0 1139672 336187570 /usr/lib64/librpmdb-4.4.so
yum 16790 REG raiz mem 253,0 407792 336187568 /usr/lib64/librpmio-4.4.so
yum 16790 mem REG raiz 253,0 233144 336171420 /usr/lib64/libnspr4.so
yum 16790 root mem REG 253,0 375656 336187569 /usr/lib64/libsqlite3.so.0.8.6
yum 16790 mem REG raiz 253,0 17992 336187563 /usr/lib64/libplc4.so
yum 16790 mem REG raiz 253,0 386784 336187571 /usr/lib64/librpm-4.4.so
yum 16790 REG raiz mem 253,0 154776 336170228 /usr/lib64/librpmbuild-4.4.so
yum 16790 mem REG raiz 253,0 647608 346128759 /lib64/libglib-2.0.so.0.1200.3
yum 16790 mem REG raiz 253,0 1297136 336176959 /usr/lib64/libxml2.so.2.6.26
yum 16790 root mem REG 253,0 15584 346128756 /lib64/libtermcap.so.2.0.8
yum 16790 root mem REG 253,0 1234328 336187566 /usr/lib64/libnss3.so
yum 16790 mem REG raiz 253,0 18152 346128670 /lib64/libutil-2.5.so
yum 16790 root mem REG 253,0 34240 336177071 /usr/lib64/libpopt.so.0.0.0
yum 16790 mem REG raiz 253,0 67792 336187567 /usr/lib64/libbz2.so.1.0.3
yum 16790 REG raiz mem 253,0 143144 346128763 /lib64/libexpat.so.0.5.0
yum 16790 REG raiz mem 253,0 56434416 336184082 / usr / lib / locale / locale-archive
yum 16790 root mem REG 253,0 132656 336560181 /usr/lib64/python2.4/site-packages/rpm/_rpmmodule.so
yum 16790 root mem REG 253,0 154016 336187565 /usr/lib64/libnssutil3.so
yum 16790 root mem REG 253,0 96885 345638632 /usr/local/greenplum-loaders-3.3.0.0-build-3/lib/libz.so.1.2.3
yum 16790 mem REG raiz 253,0 247496 346128741 /lib64/libsepol.so.1
yum 16790 mem REG raiz 253,0 369144 336168883 /usr/lib64/libsoftokn3.so
yum 16790 root mem REG 253,0 312336 336178453 /usr/lib64/libfreebl3.so
yum 16790 REG raiz mem 253,0 20240 336530067 /usr/lib64/python2.4/lib-dynload/timemodule.so
yum 16790 REG raiz mem 253,0 25048 336529953 /usr/lib64/python2.4/lib-dynload/stropmodule.so
yum 16790 REG raiz mem 253,0 18984 336530051 /usr/lib64/python2.4/lib-dynload/cStringIO.so
yum 16790 REG raiz mem 253,0 21816 336529943 /usr/lib64/python2.4/lib-dynload/collectionsmodule.so
yum 16790 REG raiz mem 253,0 52152 336530044 /usr/lib64/python2.4/lib-dynload/_socketmodule.so
yum 16790 REG raiz mem 253,0 17200 336530045 /usr/lib64/python2.4/lib-dynload/_ssl.so
yum 16790 REG raiz mem 253,0 315080 346128749 /lib64/libssl.so.0.9.8e
yum 16790 root mem REG 253,0 1366912 346128748 /lib64/libcrypto.so.0.9.8e
yum 16790 root mem REG 253,0 190976 336187552 /usr/lib64/libgssapi_krb5.so.2.2
yum 16790 mem REG raiz 253,0 613928 336184245 /usr/lib64/libkrb5.so.3.3
yum 16790 mem REG raiz 253,0 11760 346128747 /lib64/libcom_err.so.2.1
yum 16790 mem REG raiz 253,0 153720 336181723 /usr/lib64/libk5crypto.so.3.1
yum 16790 REG raiz mem 253,0 35984 336177832 /usr/lib64/libkrb5support.so.0.1
yum 16790 root mem REG 253,0 9472 346128681 /lib64/libkeyutils-1.2.so
yum 16790 root mem REG 253,0 92816 346128730 /lib64/libresolv-2.5.so
yum 16790 REG raiz mem 253,0 75384 336530050 /usr/lib64/python2.4/lib-dynload/cPickle.so
yum 16790 root mem REG 253,0 23736 336530064 /usr/lib64/python2.4/lib-dynload/structmodule.so
yum 16790 REG raiz mem 253,0 27336 336528958 /usr/lib64/python2.4/lib-dynload/operator.so
yum 16790 root mem REG 253,0 21520 336529958 /usr/lib64/python2.4/lib-dynload/zlibmodule.so
yum 16790 REG raiz mem 253,0 37944 336528952 /usr/lib64/python2.4/lib-dynload/itertoolsmodule.so
yum 16790 REG raiz mem 253,0 21528 336528929 /usr/lib64/python2.4/lib-dynload/_localemodule.so
yum 16790 root mem REG 253,0 21208 336529939 /usr/lib64/python2.4/lib-dynload/binascii.so
yum 16790 REG raiz mem 253,0 12080 336530062 /usr/lib64/python2.4/lib-dynload/shamodule.so
yum 16790 REG raiz mem 253,0 13168 336530058 /usr/lib64/python2.4/lib-dynload/md5module.so
yum 16790 REG raiz mem 253,0 18000 336529947 /usr/lib64/python2.4/lib-dynload/mathmodule.so
yum 16790 root mem REG 253,0 12504 336529934 /usr/lib64/python2.4/lib-dynload/_randommodule.so
yum 16790 root mem REG 253,0 15320 336528948 /usr/lib64/python2.4/lib-dynload/fcntlmodule.so
yum 16790 REG raiz mem 253,0 32816 336530049 /usr/lib64/python2.4/lib-dynload/bz2.so
yum 16790 root mem REG 253,0 8608 336529946 /usr/lib64/python2.4/lib-dynload/grpmodule.so
yum 16790 root mem REG 253,0 38696 336529819 /usr/lib64/python2.4/site-packages/cElementTree.so
yum 16790 REG raiz mem 253,0 42672 336530047 /usr/lib64/python2.4/lib-dynload/arraymodule.so
yum 16790 root mem REG 253,0 9368 336528915 /usr/lib64/python2.4/lib-dynload/_bisect.so
yum 16790 root mem REG 253,0 74992 336529944 /usr/lib64/python2.4/lib-dynload/datetime.so
yum 16790 root mem REG 253,0 372912 336560510 /usr/lib64/python2.4/site-packages/M2Crypto/__m2crypto.so
yum 16790 REG raiz mem 253,0 7120 336529937 /usr/lib64/python2.4/lib-dynload/_weakref.so
yum 16790 REG raiz mem 253,0 17496 336528966 /usr/lib64/python2.4/lib-dynload/selectmodule.so
yum 16790 REG raiz mem 253,0 46448 336528961 /usr/lib64/python2.4/lib-dynload/pyexpat.so
yum 16790 root mem REG 253,0 33896 336529820 /usr/lib64/python2.4/site-packages/_sqlite.so
yum 16790 REG raiz mem 253,0 41784 336530075 /usr/lib64/python2.4/site-packages/_sqlitecache.so
yum 16790 REG raiz mem 253,0 25104 336530066 /usr/lib64/python2.4/lib-dynload/termios.so
yum 16790 REG raiz mem 253,0 7280 336530065 /usr/lib64/python2.4/lib-dynload/syslog.so
yum 16790 root mem REG 253,0 25464 336265457 /usr/lib64/gconv/gconv-modules.cache
yum 16790 REG raiz mem 253,0 66544 336528926 /usr/lib64/python2.4/lib-dynload/_cursesmodule.so
yum 16790 REG raiz mem 253,0 380336 336181932 /usr/lib64/libncurses.so.5.5
yum 16790 root mem REG 253,0 405880 336529957 /usr/lib64/python2.4/lib-dynload/unicodedata.so
yum 16790 root mem REG 253,0 24576 236520047 /var/lib/rpm/__db.001
yum 16790 mem REG raiz 253,0 53880 346128424 /lib64/libnss_files-2.5.so
yum 16790 mem REG raiz 253,0 23736 346128408 /lib64/libnss_dns-2.5.so
yum 16790 root mem REG 253,0 1318912 236520050 /var/lib/rpm/__db.002
yum 16790 root mem REG 253,0 663552 236520051 /var/lib/rpm/__db.003
yum 16790 root mem REG 253,0 769074 336174965 /usr/share/locale/en_US/LC_MESSAGES/redhat-dist.mo
yum 16790 raiz 0u CHR 136,8 0t0 10 / dev / pts / 8 (excluído)
yum 16790 raiz 1u CHR 136,8 0t0 10 / dev / pts / 8 (excluído)
yum 16790 root 2u CHR 136,8 0t0 10 / dev / pts / 8 (excluído)
Soquete yum 16790 root 3u unix 0xffff8104388d2e40 0t0 4675113
yum 16790 raiz 4w REG 253,0 0 236522326 /var/log/yum.log
yum 16790 root 5u REG 253,0 605184 236520025 /var/cache/yum/WANdisco-dev/primary.xml.gz.sqlite
yum 16790 raiz 6u REG 253,0 20480 236524002 /var/cache/yum/addons/primary.sqlite.old.tmp (excluído)
yum 16790 root 7u REG 253,0 12578816 236519970 /var/cache/yum/base/primary.xml.gz.sqlite.old.tmp (excluído)
yum 16790 root 8u REG 253,0 17972224 236523993 /var/cache/yum/epel/317109b44f1b0b40d910dc60c9080e62c7f4b16a-primary.sqlite.old.tmp (excluído)
yum 16790 raiz 9u REG 253,0 967680 236524055 /var/cache/yum/extras/primary.sqlite.old.tmp (excluído)
yum 16790 raiz 10u REG 253,0 459776 246415366 /var/cache/yum/pgdg92/primary.sqlite.old.tmp (excluído)
yum 16790 raiz 11u REG 253,0 4927488 236524060 /var/cache/yum/updates/primary.sqlite.old.tmp (excluído)
yum 16790 raiz 12r REG 253,0 65204224 236519434 / var / lib / rpm / Pacotes
yum 16790 raiz 13r REG 253,0 45056 236519438 / var / lib / rpm / nome
yum 16790 raiz 14u IPv4 4675317 0t0 TCP jupiter.example.com:33597->riksun.riken.go.jp:http (ESTABELECIDO)
yum 16790 raiz 15u IPv4 4675939 0t0 TCP jupiter.example.com:52708->freedom.itsc.cuhk.edu.hk:http (CLOSE_WAIT)
yum 16790 root 16r REG 253,0 65204224 236519434 / var / lib / rpm / Pacotes
yum 16790 raiz 17r REG 253,0 45056 236519438 / var / lib / rpm / nome
yum 16790 raiz 18r REG 253,0 12288 236519440 / var / lib / rpm / Pubkeys
yum 16790 raiz 20r FIFO 0,6 0t0 4676024 tubo
yum 16790 raiz 24w FIFO 0,6 0t0 4676024 tubo
del
fonte
Mate os outros processos que manipulam o mesmo bloqueio e ele provavelmente não funcionará.
David Schwartz
@ David - Eu não posso matar nenhum dos processos yum na lista de processos acima; todos eles têm o mesmo problema.
del
Eu removi as linhas extras porque elas não estavam adicionando mais informações e estavam dificultando a leitura da sua postagem.
terdon
@slm - lsof mostra os soquetes TCP para riksun.riken.go.jp:80 (ESTABLISHED) e freedom.itsc.cuhk.edu.hk:80 (CLOSE_WAIT). Eu acho que poderia ser isso?
del
@ slm - Por favor, veja minha pergunta atualizada.
del

Respostas:

18

Um processo no estado S ou D geralmente ocorre em uma chamada do sistema de bloqueio, como ler ou gravar em um arquivo ou na rede, aguardar a conclusão de um programa chamado ou aguardar semáforos ou outras primitivas de sincronização. Ele entrará no estado de suspensão enquanto espera.

Você não pode "acordá-lo" - ele só continuará quando os dados / recursos pelos quais estiver aguardando estiverem disponíveis. Tudo isso é normal e esperado, e apenas um problema ao tentar matá-lo.

Você pode tentar usar strace -p pidpara descobrir qual chamada do sistema está acontecendo no momento para o processo pid.

Da wikipedia :

Um estado de suspensão ininterrupta é um estado de suspensão que não processa um sinal imediatamente. Ele será ativado apenas como resultado da disponibilidade de um recurso aguardado ou após um tempo limite durante essa espera (se especificado quando colocado no modo de suspensão). É usado principalmente por drivers de dispositivo que aguardam E / S de disco ou rede (entrada / saída). Quando o processo dorme ininterruptamente, os sinais acumulados durante o sono serão notados quando o processo retornar da chamada ou interceptação do sistema.

Um processo bloqueado em uma chamada do sistema está em suspensão ininterrupta, que, como o próprio nome diz, é realmente ininterrupta mesmo pela raiz.

Normalmente, os processos não podem bloquear o SIGKILL. Mas o código do kernel pode e os processos executam o código do kernel quando chamam chamadas do sistema, durante as quais o código do kernel bloqueia todos os sinais. Portanto, se uma chamada do sistema for bloqueada indefinidamente, pode não haver maneira eficaz de interromper o processo. O SIGKILL só entrará em vigor quando o processo concluir a chamada do sistema.

harrymc
fonte
2
Eu pensei que apenas processos ininterruptos de sono foram capazes de bloquear o SIGKILL. Os processos interruptíveis do sono também são capazes? Se sim, qual é a diferença entre eles?
del
1
Os estados S e D são de fato ininterruptos, simplesmente porque são muito complexos para programar no kernel e porque no passado eles deveriam ter apenas uma duração muito curta. Embora o kernel tenha evoluído para incluir o NFS e outros casos que podem levar muito mais tempo, as esperas de bloqueio do kernel infelizmente nunca foram abolidas.
harrymc
3
Interessante. Você tem alguma referência para isso? Tudo o que consigo encontrar com o Google parece dizer que processos interrompíveis não devem ser capazes de ignorar o SIGKILL.
del
1
Parece apenas contradizer tudo o que li sobre sono interrompível, e estou um pouco cético por ter encontrado algum comportamento indocumentado. por exemplo, verifique os 2 links a seguir. Estou entendendo mal alguma coisa? (1) "Em um sono interrompível, o processo pode ser acordado para o processamento de sinais". (2) "Se um sinal é gerado para um processo nesse estado, a operação é interrompida e o processo é acordado pela entrega de um sinal."
del
1
Uma chamada do sistema é interrompível ou não depende apenas de como foi programada. Uma vez dentro do kernel, tudo corre bem.
harrymc
10

Antecedentes em um processo adormecido

Você pode dar uma olhada nesta postagem sobre Unix e Linux.

Especificamente, esta resposta, /unix//a/5648/7453 .

Trecho desse post

kill -9 (SIGKILL) sempre funciona, desde que você tenha permissão para interromper o processo. Basicamente, o processo deve ser iniciado por você e não ser setuid ou setgid, ou você deve ser root. Há uma exceção: mesmo o root não pode enviar um sinal fatal para o PID 1 (o processo de inicialização).

No entanto, não é garantido que o kill -9 funcione imediatamente. Todos os sinais, incluindo o SIGKILL, são entregues de forma assíncrona: o kernel pode demorar para entregá-los. Geralmente, a entrega de um sinal leva no máximo alguns microssegundos, apenas o tempo necessário para o alvo obter uma fatia de tempo. No entanto, se o alvo tiver bloqueado o sinal, o sinal ficará na fila até que o alvo o desbloqueie.

Normalmente, os processos não podem bloquear o SIGKILL. Mas o código do kernel pode, e os processos executam o código do kernel quando chamam chamadas do sistema. O código do kernel bloqueia todos os sinais ao interromper a chamada do sistema, resultando em uma estrutura de dados mal formada em algum lugar do kernel ou, geralmente, em alguma invariante do kernel sendo violada. Portanto, se (devido a um erro ou erro de design) uma chamada do sistema é bloqueada indefinidamente, pode não haver maneira de eliminar o processo. (Mas o processo será interrompido se alguma vez concluir a chamada do sistema.)

...

...

Eu sugiro ler o resto dessa resposta!

Matar um processo bloqueado por um recurso (arquivo ou rede)

Aqui estão duas coisas para tentar.

1. Removendo o arquivo .pid do yum

Existe um arquivo de bloqueio do yum? O que acontece quando você remove esse arquivo de bloqueio? Eu acho que isso pode permitir que continue.

rm /var/run/yum.pid

2. Forçar o CLOSE_WAITfechamento de qualquer conexão TCP suspensa

A CLOSE_WAITé descrito da seguinte forma:

CLOSE_WAIT Indica que o servidor recebeu o primeiro sinal FIN do cliente e a conexão está no processo de fechamento.

Portanto, isso significa essencialmente que his é um estado em que o soquete está aguardando a execução do aplicativo close ()

Um soquete pode estar no estado CLOSE_WAIT indefinidamente até que o aplicativo o feche. Cenários defeituosos seriam como vazamento do filedescriptor, o servidor não sendo executado close () no soquete, levando ao empilhamento dos soquetes close_wait

NOTA: Trecho do site da technet .

Existem 2 ferramentas que você pode tentar usar para fazer isso.

Essas ferramentas funcionam simulando a troca FIN-ACK-RST necessária para que uma conexão TCP seja completamente fechada.

O Killcx funciona criando um pacote SYN falso com um SeqNum falso, falsificando o IP / porta do cliente remoto e enviando-o para o servidor. Ele bifurcará um processo filho que capturará a resposta do servidor, extrairá os 2 valores mágicos do pacote ACK e os usará para enviar um pacote RST falsificado. A conexão será fechada.

NOTA: Trecho do site Killcx .

Usando cortador

Corta a conexão específica entre os dois pares de números de ip / porta fornecidos.

# cutter ip-address-1 port-1 ip-address-2 port-2
% cutter 200.1.2.3 22 10.10.0.45 32451

Usando Killcx

Corta conexões para ip e porta remotos.

# killcx remote-ip-address:port
% killcx 120.121.122.123:1234

Recursos

slm
fonte
A remoção do arquivo de bloqueio não teve efeito.
del
1
Isso está em uma máquina de produção e, infelizmente, essas duas ferramentas têm dependências que não consigo instalar. Tentei reiniciar o /etc/init.d/networking e ele não fez nada. Na verdade, agora estou mais interessado em entender por que isso pode acontecer (já que eu não achava que os processos de suspensão interrompidos pudessem ignorar SIGKILL), e não como eu posso resolver esse problema.
del
Reiniciar a rede teria o mesmo efeito; portanto, o bloqueio de E / S, se é isso que o processo está esperando, fica em outro lugar.
SLM
1

Você pode tentar matar o processo pai. Use ps para verificar:

ps xjf -C yum

Em seguida, kill -9qualquer processo pai.

Terdon
fonte
O processo pai é init (quinta coluna na minha saída).
del
1

Pode valer a pena anexar ao processo com strace para ver se ele está realmente ocioso ou preso em uma operação de E / S. Talvez forneça mais pistas para a questão.

strace -pPID

Pelo que li, não há como matar esse processo a não ser reiniciar. Se o processo não estiver consumindo nenhum tempo visível da CPU, é improvável que crie um impacto negativo no servidor.


fonte
Obrigado pela sugestão, mas o processo pai é init (consulte a quinta coluna na minha saída).
del
Re sua resposta revisada, strace anexa ao processo, mas não produz nada.
del
1

Pode estar esperando um processo filho? Eu amo ps fauxporque ele dirá se existem processos filhos ou não, e se, que você pode precisar matar.

Stefan Seidel
fonte
Não, esse processo não possui nenhum processo filho.
del