¿Podría alguien explicarme la diferencia entre kill
y killall
? ¿Por qué no killall
ve lo que ps
muestra?
# 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
El sistema es SuSe 11.3 (64 bit); núcleo 2.6.34-12; procps versión 3.2.8; killall de PSmisc 22.7; matar desde GNU coreutils 7.1
Respuestas:
¿Está esto en Linux?
En realidad, hay algunas versiones ligeramente diferentes del nombre del comando que son utilizados por
ps
,killall
, etc.Las dos variantes principales son: 1) el nombre de comando largo, que es lo que obtienes cuando corres
ps u
; y 2) el nombre corto del comando, que es lo que obtienes cuando corresps
sin ningún indicador.Probablemente la mayor diferencia ocurre si su programa es un script de shell o cualquier cosa que requiera un intérprete, por ejemplo, Python, Java, etc.
Aquí hay un script realmente trivial que demuestra la diferencia. Lo llamé
mycat
:Después de ejecutarlo, aquí están los dos tipos diferentes de
ps
.Primero, sin
u
:En segundo lugar, con
u
:¿Observa cómo comienza la segunda versión
/bin/sh
?Ahora, por lo que puedo decir, en
killall
realidad lee/proc/<pid>/stat
y toma la segunda palabra entre los parens como el nombre del comando, así que eso es realmente lo que necesitas especificar cuando correskillall
. Lógicamente, eso debería ser lo mismo que diceps
lau
bandera, pero sería una buena idea verificarlo.Cosas para verificar:
cat /proc/<pid>/stat
dice el nombre del comando?ps -e | grep db2
dice el nombre del comando?ps -e | grep db2
yps au | grep db2
mostrar el mismo nombre de comando?Notas
Si también está utilizando otros indicadores ps, puede que le resulte más fácil de usar
ps -o comm
para ver el nombre corto yps -o cmd
el nombre largo.También puede encontrar
pkill
una mejor alternativa. En particular,pkill -f
intenta hacer coincidir usando el nombre completo del comando, es decir, el nombre del comando tal como se imprime conps u
ops -o cmd
.fuente
ps -e |grep db2 gives me
3084? 00:00:00 db2syscr` y ps aux | grep db2 me daroot 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwd
. Podría comentar sobre eso. Estoy un poco perdidols -l /proc/3084/exe
dice ¿Qué pasa conwhich
owhence
otype
para buscar el archivo y, a continuaciónls
, ytype
para ver si es un enlace simbólico o una secuencia de comandos o un archivo binario?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
killall intenta hacer coincidir el nombre de un proceso (pero en realidad no es tan bueno en la parte correspondiente).
Y como "ps | grep" y "ps | grep | kill" funcionan mucho mejor, alguien simplificó esto y creó pgrep y pkill. Lea los comandos como "ps grep" y "ps kill", ya que ese comando primero ps luego grep y si lo desea mata.
fuente
Tuve un problema similar pero
/proc/<pid>/stat
contenía la cadena esperada. Al usar strace pude ver que Killall también accedió/proc/<pid>/cmdline
.Continué investigando usando gdb para encontrar que en mi caso falló en una verificación de mi comando al comando completo, incluidos todos los args encontrados
/proc/<pid>/cmdline
. Parecía que esa ruta del código se activó debido a que el nombre del archivo tenía más de 15 caracteres (que es un valor codificado en la fuente de killall). No investigué completamente si de alguna manera podría hacer que funcionara con killall.Pero como se menciona en otros comentarios aquí, pkill es una mejor alternativa que no tiene los mismos problemas.
El código fuente de
pkill
se puede encontrar aquí https://github.com/acg/psmisc para los interesados.fuente
En los sistemas Ubuntu 16, / proc / pid / stat contendrá el nombre del hilo (que un programa puede llamar a través del sistema pthread_setname_np ).
fuente