¿Está esto en Linux?
En realidad, hay algunas versiones sutilmente diferentes del nombre del comando que usa ps
, killall
, etc.
Las dos variantes principales son:1) el nombre de comando largo, que es lo que obtienes cuando ejecutas ps u
; y 2) el nombre corto del comando, que es lo que obtienes cuando ejecutas ps
sin banderas.
Probablemente la mayor diferencia ocurra si su programa es un script de shell o cualquier cosa que requiera un intérprete, p. Python, Java, etc.
Aquí hay un script realmente trivial que demuestra la diferencia. Lo llamé mycat
:
#!/bin/sh
cat
Después de ejecutarlo, aquí están los dos tipos diferentes de ps
.
En primer lugar, sin u
:
$ ps -p 5290
PID TTY ... CMD
5290 pts/6 ... mycat
En segundo lugar, con u
:
$ ps u 5290
USER PID ... COMMAND
mikel 5290 ... /bin/sh /home/mikel/bin/mycat
Observe cómo la segunda versión comienza con /bin/sh
?
Ahora, por lo que sé, killall
en realidad lee /proc/<pid>/stat
, y toma la segunda palabra entre los paréntesis como el nombre del comando, así que eso es realmente lo que necesita especificar cuando ejecuta killall
. Lógicamente, eso debería ser lo mismo que ps
sin el u
dice la bandera, pero sería una buena idea comprobarlo.
Cosas para revisar:
- qué significa
cat /proc/<pid>/stat
decir que el nombre del comando es? - qué significa
ps -e | grep db2
decir que el nombre del comando es? - hacer
ps -e | grep db2
yps au | grep db2
mostrar el mismo nombre de comando?
Notas
Si también está usando otras banderas ps, puede que le resulte más sencillo usar ps -o comm
para ver el nombre corto y ps -o cmd
para ver 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 impreso por ps u
o ps -o cmd
.
killall intenta hacer coincidir el nombre de un proceso (pero en realidad no es tan bueno en la parte de coincidencia).
Y dado que "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 quiere mata.
Tuve un problema similar pero /proc/<pid>/stat
contenía la cadena esperada. Usando strace pude ver que killall también accedió a /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 argumentos encontrados en /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é a fondo si de alguna manera podí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.