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