Linux: Prozess basierend auf Argumenten beenden

54

Wie kann ich einen Prozess basierend auf seinen Befehlszeilenargumenten beenden? killall, pgrepund pkillscheinen nur auf der Grundlage des Prozessnamens zu funktionieren.

Ich brauche dies, um in der Lage zu sein, zwischen einer Reihe von Anwendungen zu unterscheiden, die in virtuellen Java-Maschinen ausgeführt werden. Dabei javaist der Prozessname für alle und der tatsächliche Anwendungsname kann anhand der Befehlszeilenargumente ermittelt werden.

Dies kann manuell durchgeführt ps aux | grep myapp.jarwerden, indem die pid manuell aus der Ausgabe entfernt wird, aber ich möchte, dass ein Befehl automatisch etwas Äquivalentes ausführt.

Mark Howard
quelle

Antworten:

69

pgrepIch pkillnehme eine -fFlagge. Von der manSeite:

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

Zum Beispiel:

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

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

$ pgrep sleep
8008
Michael Mrozek
quelle
+1, aber meine Bash 4.1.5 funktioniert nicht für einen Doppelpunkt nach einem kaufmännischen Und (wie in der ersten Zeile des Beispiels) ... bash: syntax error near unexpected token ';'... funktioniert in einer case- Anweisung, wenn auf das kaufmännische Und ein ;;... folgt Sie verwenden eine andere Shell (?)
Peter.O
@ jw013 Ich habe tatsächlich verwendet zsh, was die von mir verwendete Syntax unterstützt. Das Auslassen funktioniert in beiden Fällen, also habe ich es entfernt
Michael Mrozek
@MichaelMrozek ok nvm dann :) Ich frage mich, ob unix.SE einen höheren Anteil an zshBenutzern als anderswo hat - ich scheine zshhier nur Benutzer zu finden .
Jw013
4

Sie können htopalle derzeit ausgeführten Prozesse mit ihren Befehlszeilenargumenten anzeigen und einen ausgewählten Prozess beenden.

Jan Henke
quelle
4

Ersetzen Sie argumentunten mit einem regulären Ausdruck, der die gesamte Befehlszeile eines Prozesses umfassen muss:

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

Wenn Sie pkill oder was auch immer nicht haben, verwenden Sie einfach proc / [1-9] * / cmdline

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