Jak zabić wszystkie procesy oprócz określonego

13

Na moim serwerze lokalnym działa wiele procesów Java, a jednocześnie korzystam z Eclipse. Teraz, kiedy muszę zrestartować swoje procesy (uruchamiam procesy za pomocą skryptu powłoki), przed każdym uruchomieniem muszę zabić stare procesy poprzez:

Metoda 1: - kill -9 $Pid (dla każdego procesu jeden po drugim, co jest czasochłonne)

Metoda 2: - killall -9 java(dla wszystkich procesów - łatwa, ale Eclipse zostanie zabita zbyt niepotrzebnie)

W przypadku metody 2 Eclipse również zostanie zabity, czego nigdy nie chcę. Czy jest na to wyjście? Założę się, że musi być: P

Edycja: Używam Ubuntu 15.04.

Atiq
źródło
korzystasz z openjdk?
Maythux,
nie, to java-7-oracle
Atiq
sprawdź moją odpowiedź
Maythux,

Odpowiedzi:

17

Spróbuj tego polecenia:

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

to przeszuka wszystkie procesy zawierające java i wykonujące zaćmienie, a następnie je zabije

Maythux
źródło
3
++ 1 do nie korzystania -9bezkrytycznie. Powinieneś kiedykolwiek dać procesowi szansę na wdzięczne wyjście.
Rmano
pgrepjest lepszy niż ps | grepw przeciwnym razie ryzykujesz zabicie samego polecenia grep.
dniu
2
@abligh Problem polega na tym, pgrepże nie jesteś w stanie odróżnić, które procesy wykonują zaćmienie, ponieważ nawet pgrep -lpo prostu zgłosi java. @ Maythux, tylko dla odniesienia, egrepjest przestarzały i nie powinien być używany, ponieważ grep -Erobi dokładnie to samo, chociaż nawet nie potrzebujesz, grep -Eponieważ dopasowujesz stały ciąg; więc po prostu grep -v "eclipse"(lub jeśli chcesz być fantazyjny [...] | grep -F "java" | grep -vF "eclipse | [...]")
Kos
@kos: untested:pkill '/java\(.*eclipse\)\@!'
abligh 24.07.15
@abligh What \@!? Jeśli jest to perlizm, to nie zadziała, ponieważ pkillobsługuje tylko ERE, próbowałem zredukować to całe zadanie do pojedynczego polecenia, które jest już używane pkillz negatywnymi prognozami i z tego powodu nie powiodło się.
Kos
12

Za pomocą awk

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

Polecenie zabija wszystkie javaprocesy, ale nie proces eclipse.

AB
źródło
3
Bardziej elegancka (i szybsza) niż odpowiedź @maythux IMHO ... ;-)
Fabby
Zgadzam się z Fabby, miło!
Kos
1

Co powiesz na :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'wyszukuje javaw pełnym wierszu poleceń procesów i wyświetla je

  • grep -Po '^[^ ]+(?!.*eclipse)'przegląda wyszukiwane procesy i uzyskuje identyfikatory procesów, których nie ma eclipsew pełnych wierszach poleceń

  • xargs kill zabije procesy.

heemayl
źródło
+1 za krótkie i eleganckie rozwiązanie. Zauważ, że byłoby możliwe, aby mieć jeszcze bardziej wydajne (tylko jedno polecenie :) pkillrozwiązanie, jeśli pgrep/pkillobsługiwane wyrażenia regularne perla, których używasz w drugim kroku powyżej. Niestety pgrep/ pkillobsługuje tylko rozszerzone wyrażenia regularne (jak egrep/grep -E).
arielf
@arielf Masz całkowitą rację .. byłby najbardziej wydajny, gdyby pgrep/ pkillwspiera PCRE ..
heemayl
0

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

Użyj jps, aby upewnić się, że szukasz tylko poleceń Java, a nie wszystkich poleceń, które mają Java na swojej ścieżce.

Chetan Narsude
źródło
0
ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill
Ankur Kumar
źródło
1
Lepiej byłoby wyjaśnić polecenia, niż dać po prostu tajemniczy ciąg poleceń. A co z moim długotrwałym poleceniem „orkjavagoob.sh”
waltinator,