pkill não pode matar processos com id de processo pai 1

6

Eu quero matar os seguintes processos usando

pkill "run_tcp_sender.sh"

ou

pkill -SIGKILL  "run_tcp_sender.sh"


    root     14320     1  0  2012 ?        00:00:00 bash run_tcp_sender.sh 138.96.116.22
    root     14323     1  0  2012 ?        00:00:00 bash run_tcp_sender.sh 138.96.116.22
    root     14325     1  0  2012 ?        00:00:00 bash run_tcp_sender.sh 138.96.116.22
    root     14327     1  0  2012 ?        00:00:00 bash run_tcp_sender.sh 138.96.116.22
    root     14328     1  0  2012 ?        00:00:00 bash run_tcp_sender.sh 138.96.116.22
    root     14330     1  0  2012 ?        00:00:00 bash run_tcp_sender.sh 138.96.116.22

mas é inútil os processos permanecem lá o que há de errado com o meu comando?

BTW:  Eu posso usar o seguinte comando para conseguir o que eu quero

kill -9 $(ps -ef|grep "run_tcp"|grep -v "grep"|awk '{print $2}')
    
por misteryes 06.05.2013 / 16:15

3 respostas

15

pkill por padrão envia o sinal SIGTERM para os processos pararem. Aqui está uma lista dos sinais que você pode enviar um processo. Você pode enviá-los por nome ou número normalmente:

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

Então você está enviando sinal # 15. Se os processos não estão respondendo a este sinal, então você pode precisar usar o sinal # 9, pkill -SIGKILL .

Na página de manual do pkill :

-signal

  Defines the signal to send to each matched process.  Either the
  numeric  or  the symbolic signal name can be used.  (pkill only.)

Problemas com pkill

O OP mencionou que não teve sucesso em fazer com que pkill -SIGKILL "run_tcp" funcionasse. Inicialmente pensamos que o problema tinha a ver com pkill potencialmente se matando antes de terminar de matar todos os processos "run_tcp".

Mas era difícil aceitar uma nota de rodapé na página pkill man:

The running pgrep or pkill process will never report itself as a match.

Além disso, @Gilles deixou um comentário basicamente dizendo a mesma coisa, que pkill simplesmente não se mata. Então ele nos deu uma grande pista sobre o que realmente estava acontecendo.

Veja um exemplo que demonstra o que o OP e eu estávamos perdendo:

passo 1 - crie um script sleepy.bash

#!/bin/bash

sleep 10000

passo 2 - carregar algumas tarefas falsas de sono

$ for i in 'seq 1 5';do bash sleepy.bash & done
[1] 12703
[2] 12704
[3] 12705
[4] 12706
[5] 12707

passo 3 - verifique as tarefas em execução

$ ps -eaf|egrep "sleep 10000|sleepy"
saml     12703 29636  0 21:48 pts/16   00:00:00 bash sleepy.bash
saml     12704 29636  0 21:48 pts/16   00:00:00 bash sleepy.bash
saml     12705 29636  0 21:48 pts/16   00:00:00 bash sleepy.bash
saml     12706 29636  0 21:48 pts/16   00:00:00 bash sleepy.bash
saml     12707 29636  0 21:48 pts/16   00:00:00 bash sleepy.bash
saml     12708 12704  0 21:48 pts/16   00:00:00 sleep 10000
saml     12709 12707  0 21:48 pts/16   00:00:00 sleep 10000
saml     12710 12705  0 21:48 pts/16   00:00:00 sleep 10000
saml     12711 12703  0 21:48 pts/16   00:00:00 sleep 10000
saml     12712 12706  0 21:48 pts/16   00:00:00 sleep 10000

passo 4 - tente usar meu pkill

$ pkill -SIGTERM sleepy.bash

etapa 5 - o que aconteceu?

Fazendo o comando ps acima, vemos que nenhum dos processos foi eliminado, assim como a questão dos OPs. O que está acontecendo?

Acontece que este é um problema em como estávamos tentando usar o pkill . O comando:

pkill -SIGTERM "sleepy.bash"

estava procurando um processo com o nome "sleepy.bash" . Bem, não existem processos com esse nome. Existem processos que são nomeados "bash sleepy.bash" . Então, pkill estava procurando processos para matar e não encontrar nenhum e, em seguida, saindo.

Então, se ajustarmos um pouco o pkill que estamos usando para isso:

$ pkill -SIGTERM -f "sleepy.bash"
[1]   Terminated              bash sleepy.bash
[2]   Terminated              bash sleepy.bash
[3]   Terminated              bash sleepy.bash
[4]-  Terminated              bash sleepy.bash
[5]+  Terminated              bash sleepy.bash

Agora temos o efeito que procurávamos. Qual é a diferença? Usamos a opção -f para pkill , o que faz com que pkill use todo o caminho da linha de comando ao corresponder apenas com o nome do processo.

da página de manual do pkill

-f      The pattern is normally only matched against the process name.  
        When  -f  is  set, the full command line is used.

Métodos alternativos

kill, ps

Este método é bem detalhado, mas também funciona:

kill -9 $(ps -ef|grep "run_tcp"|grep -v "grep"|awk '{print $2}')

pgrep w / pkill & killall

Você pode usar pgrep para alimentar uma lista de PIDs para pkill ou usar killall .

Exemplos

# pgrep solution
$ pgrep "run_tcp" | pkill -SIGKILL

# killall
killall -SIGKILL -r run_tcp

Referências

por 06.05.2013 / 16:25
5

Isso não está relacionado ao ID do processo pai. O problema é simplesmente que você está eliminando todos os processos que executam run_tcp_sender.sh , mas você não tem nenhum desses processos - os processos nos quais você está interessado estão executando bash .

Você pode instruir pkill para corresponder em toda a linha de comando:

pkill -f '^bash run_tcp_sender.sh'

Outra abordagem seria eliminar todos os processos que possuem o script aberto. Isso pode causar danos colaterais, por ex. para um editor que estava apenas abrindo o script.

fuser -k /path/to/run_tcp_sender.sh

Contanto que você não esteja editando o script como root, a eliminação dos processos do root resolveria o problema:

kill $(lsof -uroot /path/to/run_tcp_sender.sh)
    
por 07.05.2013 / 03:18
0

Tente matar o processo com "sinal 9", quero dizer usar

kill -9 PID

normalmente o sinal 9 não é recomendado para matar o mecanismo de banco de dados

se o processo permanecer na memória, algum i / o perdido ou processo está aguardando a conclusão da I / O

    
por 06.05.2013 / 16:22

Tags