Linux: Kill process basé sur des arguments

55

Comment puis-je tuer un processus basé sur ses arguments de ligne de commande? killall, pgrepet ne pkillsemblent fonctionner qu'en fonction du nom du processus.

J'ai besoin de cela pour pouvoir différencier un certain nombre d'applications s'exécutant dans des machines virtuelles Java, où se javatrouve le nom du processus pour chacune d'elles et où le nom réel de l'application peut être trouvé en consultant les arguments de la ligne de commande.

Cela peut être fait manuellement avec ps aux | grep myapp.jar, puis tuer manuellement le pid de la sortie, mais j'aimerais qu'une commande fasse quelque chose d'équivalent automatiquement.

Mark Howard
la source

Réponses:

70

pgrep/ pkillprendre un -fdrapeau. De la manpage:

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

Par exemple:

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

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

$ pgrep sleep
8008
Michael Mrozek
la source
+1, mais mon bash 4.1.5 ne fonctionne pas pour un deux-points après une esperluette (comme dans la première ligne de l'exemple) ... bash: syntax error near unexpected token ';'... Cela fonctionne dans une instruction case lorsque l'esperluette est suivie de ;;... peut-être vous utilisez un shell différent (?)
Peter.O
@ jw013 J'utilisais réellement zsh, ce qui supporte la syntaxe que j'ai utilisée. Cependant, je l’ai enlevé
Michael Mrozek
@MichaelMrozek ok nvm then :) Je me demande si unix.SE a une proportion d' zshutilisateurs plus élevée qu'ailleurs - je semble ne trouver que des zshutilisateurs ici.
Jw013
4

Vous pouvez utiliser htoppour afficher tous les processus en cours d'exécution avec leurs arguments de ligne de commande et pour tuer un processus sélectionné.

Jan Henke
la source
4

Remplacez argumentci-dessous par une expression régulière qui doit contenir la totalité de la ligne de commande d'un processus:

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

Si vous n'avez pas pkill ou autre chose, utilisez simplement proc / [1-9] * / cmdline

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