Linux: proceso de eliminación basado en argumentos

55

¿Cómo puedo matar un proceso basado en sus argumentos de línea de comando? killall, pgrepy pkillparece que solo funcionan en función del nombre del proceso.

Necesito esto para poder diferenciar entre una serie de aplicaciones que se ejecutan dentro de máquinas virtuales Java, donde javaestá el nombre del proceso para todas ellas y el nombre real de la aplicación se puede encontrar mirando los argumentos de la línea de comandos.

Esto se puede hacer manualmente ps aux | grep myapp.jary luego eliminar manualmente el pid de la salida, pero me gustaría que un comando haga algo equivalente automáticamente.

Mark Howard
fuente

Respuestas:

70

pgrep/ pkilltomar una -fbandera. De la manpágina:

-f    The pattern is normally only matched against the process name.
      When -f is set, the full command line is used.

Por ejemplo:

$ sleep 30& sleep 60&
[1] 8007
[2] 8008

$ pkill -f 'sleep 30'
[1]  - terminated  sleep 30

$ pgrep sleep
8008
Michael Mrozek
fuente
+1, pero mi bash 4.1.5 no funciona para los dos puntos después de un signo (como en la primera línea del ejemplo) ... bash: syntax error near unexpected token ';'... Funciona en una declaración de caso cuando el signo es seguido por ;;... tal vez está utilizando un shell diferente (?)
Peter.O
@ jw013 En realidad estaba usando zsh, lo que admite la sintaxis que usé. Dejándolo a cabo obras en tanto embargo, por lo que lo quité
Michael Mrozek
@MichaelMrozek ok nvm entonces :) Me pregunto si unix.SE tiene una mayor proporción de zshusuarios que en otros lugares, solo parece que encuentro zshusuarios aquí.
jw013
4

Puede usar htoppara ver todos los procesos que se ejecutan actualmente con sus argumentos de línea de comandos y para eliminar un proceso seleccionado.

Jan Henke
fuente
4

Reemplace a argumentcontinuación con una expresión regular que debe representar la línea de comando completa de un proceso:

kill `ps -eo pid,args --cols=10000 | awk '/argument/ && $1 != PROCINFO["pid"] { print $1 }'`
Maxim Egorushkin
fuente
0

Si no tiene pkill o lo que sea, simplemente use proc / [1-9] * / cmdline

grep -a myapp.jar /proc/[1-9]*/cmdline|tr '\0' ' '|grep -v grep|awk -F/ '{print $3}'
ikrabbe
fuente