Zabij procesy Java

25

Pracuję nad ciężkim obliczeniowo kodem, który - na razie - bardzo ulega awarii, ale nadal nad nim pracuję :) Kiedy się zawiesza, nie mogę zamknąć okna GUI; Muszę otworzyć powłokę i zabić proces -9.

Jest to proces Java i łatwo go znaleźć:

nkint@zefiro:~$ ps aux | grep java
nkint   2705 16.6  1.0 460928 43680 ?        Sl   12:23   0:08 /usr/lib/jvm/java-6-sun-1.6.0.26/bin/java -Djava.library.path=something something
nkint   2809  0.0  0.0   4012   776 pts/0    S+   12:24   0:00 grep --color=auto java
nkint@zefiro:~$ kill -9 2705

Teraz jest to łatwe, ale dość mechaniczne zadanie. Zwykle więc czekam na awarie około 7-8 procesów, a następnie kill -9każdy z nich.

Chcę to zrobić automatycznie. Wydaje mi się, że łatwe powinno być przesyłanie niektórych poleceń w celu pobrania identyfikatora wyników (n-1) ps aux | grep javai zabicia go, ale nie mam pojęcia, od czego zacząć.

Czy ktoś może dać mi jakieś wskazówki?

nkint
źródło

Odpowiedzi:

22

Jeszcze kilka rur zabierze Cię tam, gdzie chcesz być. Oto jak bym to zrobił:

search_terms='whatever will help find the specific process' 

kill $(ps aux | grep "$search_terms" | grep -v 'grep' | awk '{print $2}')

Oto co się dzieje:

grep -v 'grep' wyklucza proces grep z wyników.

awk '{print $2}' wypisuje tylko drugą kolumnę wyjścia (w tym przypadku PID)

$(...)jest podstawieniem polecenia. Zasadniczo wynik polecenia wewnętrznego zostanie użyty jako argument dokill

Ma to tę zaletę, że zapewnia lepszą kontrolę nad tym, co zostało zabite. Na przykład, jeśli korzystasz z systemu współdzielonego, możesz edytować wyszukiwane hasła, aby próbował jedynie zabić twoje własne procesy Java.

Dziekan
źródło
49

Jeśli chcesz zabić wszystkie wymienione procesy, javamożesz użyć następującego polecenia:

killall -9 java

To polecenie wysyła sygnały do ​​procesów identyfikowanych według ich nazwy.

Milan Todorovic
źródło
killall javanie działał dla mnie z jakiegoś przypadkowego powodu, którego nie byłem w stanie rozwiązać. -9Parametr zadbał o to. Dziękuję Ci.
Paul Nelson Baker
5
9 to SIGKILL. Program nie może tego zignorować, i zasadniczo mówi: zakończ się teraz.
Milan Todorovic
Użytkownicy IntelliJ mogą stwierdzić, że IDE uległo awarii, nie wspominając już o Tomcat i wielu innych aplikacjach. Jest to metoda brutalna i nie jest zalecana w żadnym systemie z usługami lub aplikacjami zwiększającymi wydajność java.
tresf
3

Otwórz edytor tekstu i zapisz ten krótki skrypt bash w swoim katalogu domowym jako „killjava”

#! /bin/bash

# Kill Java process

# Determine the pid
PID=`ps -C java -o pid=`

kill -9 $PID

Następnie chmod u+x ~/killjavaw terminalu, aby można było wykonać plik.

Następnie możesz po prostu zadzwonić ~/killjavaz terminala, a proces Java będzie zupełnie martwy. Możesz zastanowić się, jakie inne zasoby wpłyną na twoje zabicie procesu Java w ten sposób (np. Połączenia z bazą danych). Na przykład być może kill -15byłoby bardziej odpowiednie - patrz wyjaśnienie tutaj .

Clive van Hilten
źródło
2

Oto alternatywne podejście oparte na wcześniejszej odpowiedzi @ Dean.

Używa jps do identyfikacji procesu Java.

kill $(jps | grep <MainClass> | awk '{print $1}')

MainClass to klasa uruchomionego programu Java, która zawiera główną metodę.

Pawan
źródło