Alguém poderia me explicar a diferença entre kill
e killall
? Por que não killall
vê o que ps
mostra?
# ps aux |grep db2
root 1123 0.0 0.8 841300 33956 pts/1 Sl 11:48 0:00 db2wdog
db2inst1 1125 0.0 3.5 2879496 143616 pts/1 Sl 11:48 0:02 db2sysc
root 1126 0.0 0.6 579156 27840 pts/1 S 11:48 0:00 db2ckpwd
root 1127 0.0 0.6 579156 27828 pts/1 S 11:48 0:00 db2ckpwd
root 1128 0.0 0.6 579156 27828 pts/1 S 11:48 0:00 db2ckpwd
# killall db2ckpwd
db2ckpwd: no process found
# kill -9 1126
# kill -9 1127
# kill -9 1128
O sistema é SuSe 11.3 (64 bits); kernel 2.6.34-12; procps versão 3.2.8; killall do PSmisc 22.7; matar a partir do GNU coreutils 7.1
Respostas:
Isso está no Linux?
Na verdade, existem algumas versões sutilmente diferentes do nome do comando que são usados por
ps
,killall
etc.As duas principais variantes são: 1) o nome do comando longo, que é o que você obtém quando executa
ps u
; e 2) o nome abreviado do comando, que é o que você obtém ao executarps
sem nenhum sinalizador.Provavelmente a maior diferença acontece se o seu programa for um shell script ou qualquer coisa que exija um intérprete, por exemplo, Python, Java, etc.
Aqui está um script realmente trivial que demonstra a diferença. Eu chamei
mycat
:Depois de executá-lo, eis os dois tipos diferentes de
ps
.Em primeiro lugar, sem
u
:Em segundo lugar, com
u
:Observe como a segunda versão começa
/bin/sh
?Agora, até onde eu sei,
killall
na verdade lê/proc/<pid>/stat
e pega a segunda palavra entre parênteses como o nome do comando, então é exatamente isso que você precisa especificar ao executarkillall
. Logicamente, isso deve ser o mesmo que o queps
nãou
indica a bandeira, mas seria uma boa ideia verificar.Coisas a verificar:
cat /proc/<pid>/stat
diz o nome do comando?ps -e | grep db2
diz o nome do comando?ps -e | grep db2
eps au | grep db2
mostrar o mesmo nome de comando?Notas
Se você estiver usando outros sinalizadores ps também, talvez seja mais fácil usá-lo
ps -o comm
para ver o nome abreviado eps -o cmd
o nome longo.Você também pode encontrar
pkill
uma alternativa melhor. Em particular,pkill -f
tenta corresponder usando o nome completo do comando, ou seja, o nome do comando impresso porps u
oups -o cmd
.fonte
ps -e |grep db2 gives me
3084? 00:00:00 db2syscr` e ps aux | grep db2 me dároot 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwd
. Poderia comentar sobre isso. Estou um pouco perdido.ls -l /proc/3084/exe
diz? Que talwhich
ouwhence
outype
para encontrar o arquivo e, em seguida,ls
etype
para ver se é um link simbólico ou um script ou um binário?lrwxrwxrwx 1 root root 0 Jun 6 16:49 /proc/3084/exe -> /var/lib/db2/db2inst1/sqllib/adm/db2syscr
-r-sr-s--- 1 root db2iadm1 147K Feb 1 23:32 /var/lib/db2/db2inst1/sqllib/adm/db2syscr*
/var/lib/db2/db2inst1/sqllib/adm/db2syscr is /var/lib/db2/db2inst1/sqllib/adm/db2syscr
O killall tenta corresponder ao nome de um processo (mas não é realmente tão bom na parte correspondente).
E como "ps | grep" e "ps | grep | kill" fazem um trabalho muito melhor, alguém simplificou isso e criou pgrep e pkill. Leia os comandos como "ps grep" e "ps kill", pois esse comando primeiro ps depois grep e, se desejado, mata.
fonte
Eu tive um problema semelhante, mas
/proc/<pid>/stat
continha a string esperada. Usando strace, pude ver que o killall também acessava/proc/<pid>/cmdline
.I continuou a investigar usando gdb para descobrir que no meu caso ele falhou em um cheque do meu comando para o comando completo, incluindo todos os argumentos encontrados em
/proc/<pid>/cmdline
. Parecia que o caminho do código foi acionado devido ao nome do arquivo ter mais de 15 caracteres (que é um valor codificado na fonte do killall). Eu não investiguei completamente se eu poderia de alguma forma fazê-lo funcionar com killall.Mas, como mencionado em outros comentários, o pkill é uma alternativa melhor que não tem os mesmos problemas.
O código fonte
pkill
pode ser encontrado aqui https://github.com/acg/psmisc para os interessados.fonte
Nos sistemas Ubuntu 16, o / proc / pid / stat conterá o nome do thread (que um programa pode via pthread_setname_np ).
fonte