GNU/Linux >> Tutoriales Linux >  >> Linux

killall me da `no se encontró ningún proceso` pero ps

¿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:

  1. qué significa cat /proc/<pid>/stat decir que el nombre del comando es?
  2. qué significa ps -e | grep db2 decir que el nombre del comando es?
  3. hacer ps -e | grep db2 y ps 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.


Linux
  1. administrador de suscripciones:comando no encontrado

  2. rm:comando no encontrado

  3. mv:comando no encontrado

  4. ln:comando no encontrado

  5. killall:comando no encontrado

Comando Pstree en Linux

Comando matar en Linux

Comando Killall en Linux con ejemplos

aws-shell:comando no encontrado

df:comando no encontrado

du:comando no encontrado