Wie man alle Prozesse außer einem bestimmten abbricht

13

Auf meinem lokalen Server werden viele Java-Prozesse ausgeführt, und gleichzeitig verwende ich Eclipse. Wenn ich jetzt meine Prozesse neu starten muss (ich starte Prozesse über ein Shell-Skript), muss ich vor jedem Start die alten Prozesse beenden durch:

Methode 1: - kill -9 $Pid (für jeden Prozess einzeln, was zeitaufwändig ist)

Methode 2: - killall -9 java(für alle Prozesse - einfach, aber Eclipse wird zu unnötig getötet)

Bei Methode 2 wird auch Eclipse getötet, was ich nie will. Gibt es einen Ausweg? Ich wette, es muss sein: P

Edit: Ich benutze Ubuntu 15.04.

Atiq
quelle
Verwenden Sie openjdk?
24.
Nein, es ist Java-7-Orakel
Atiq
Überprüfe meine Antwort
Maythux

Antworten:

17

Probieren Sie diesen Befehl aus:

ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

Dadurch wird nach allen Prozessen gesucht, die Java enthalten, und Eclipse ausgeführt. Anschließend werden sie beendet

Maythux
quelle
3
++ 1 für die nicht-9 wahllose Verwendung . Sie sollten einem Prozess die Möglichkeit geben, ordnungsgemäß zu beenden.
Rmano
pgrepist besser als ps | grepsonst riskierst du das grep Statement selbst zu töten.
abligh
2
@abligh Das Problem ist, dass pgrepSie nicht unterscheiden können, auf welchen Prozessen Eclipse ausgeführt wird, da sogar pgrep -lnur Berichte erstellt werden java. @ Maythux ist nur als Referenz egrepveraltet und sollte nicht verwendet werden, da grep -Ees genau dasselbe tut, obwohl Sie es nicht einmal brauchen, grep -Eda Sie mit einer festen Zeichenfolge übereinstimmen. Also nur grep -v "eclipse"(oder wenn Sie Lust haben [...] | grep -F "java" | grep -vF "eclipse | [...]")
Kos
@kos: ungetestet:pkill '/java\(.*eclipse\)\@!'
abligh
@abligh Was ist \@!? Wenn das ein Perl-Ismus ist, funktioniert es nicht, da pkillnur EREs unterstützt werden. Ich habe versucht, diese ganze Aufgabe auf einen einzigen Befehl zu reduzieren, der bereits pkillmit negativen Lookaheads verwendet wird. Aus diesem Grund ist dies fehlgeschlagen.
Kos
12

Verwenden awk

ps ax | awk '/java/ && !/eclipse/ {system("kill "$1)}'

Der Befehl bricht alle javaProzesse ab, aber nicht den Prozess eclipse.

AB
quelle
3
Eleganter (und schneller) als die Antwort von @maythux IMHO ... ;-)
Fabby
Ich stimme Fabby zu, nett!
Kos
1

Wie wäre es mit :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'sucht javain der vollständigen Befehlszeile der Prozesse und listet sie auf

  • grep -Po '^[^ ]+(?!.*eclipse)'Durchsucht die durchsuchten Prozesse und ruft die Prozess-IDs der Prozesse ab, die nicht über eclipsedie vollständigen Befehlszeilen verfügen

  • xargs kill wird die Prozesse abbrechen.

heemayl
quelle
+1 für eine kurze und elegante Lösung. Beachten Sie, dass es möglich gewesen wäre, eine noch effizientere pkillLösung (nur ein Befehl pgrep/pkill:) zu haben, wenn Sie Perl-Regexes unterstützen, die Sie im zweiten Schritt oben verwenden. Leider pgrep/ pkillnur unterstützt Extended-Regexps (wie egrep/grep -E).
Arielf
@ Arielf Sie sind absolut richtig .. es wäre am effizientesten gewesen, wenn pgrep/ pkillunterstützt PCRE ..
Heemayl
0

jps -m | grep -v eclipse | awk '{print $1}' | xargs -t kill

Verwenden Sie jps, um sicherzustellen, dass Sie nur nach den Java-Befehlen suchen und nicht nach allen Befehlen, deren Pfad Java enthält.

Chetan Narsude
quelle
0
ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill
Ankur Kumar
quelle
1
Es wäre besser gewesen, die Befehle zu erklären, als nur einen kryptischen Befehlsstring anzugeben. Und was ist mit meinem langjährigen Befehl "orkjavagoob.sh"
Waltinator 25.07.15