Zabij tylko jeden proces Java

17

Zwykle uruchamiam kilka aplikacji Java, jedną dla serwera działającego lokalnie, a drugą dla niektórych IDE, takich jak NetBeans. I od czasu do czasu, po wielu ponownych wdrożeniach, mój serwer utknął na OutOfMemoryException, więc muszę zrezygnować z procesu Java, aby uruchomić się ponownie.

Tak robię, pkill -9 javaale to także zabija moje działające IDE, czego nie chcę. Jak więc zabić tylko aplikację połączoną z uruchomionym serwerem, a nie inne? Zakładam, że wszystkie działają w ramach tego samego procesu, ale musi być jakiś sposób ich rozróżnienia.

Petr Mensik
źródło
2
spójrz na swoją tabelę procesów (za pomocą toplub ps) i wybierz właściwą i zabij ją za pomocą PID (kill -9 PID_number).
pędzi
O tak, teraz to widzę. Więc muszę po prostu zabić proces PID.
Wielkie
Muszę to zautomatyzować. Jak uzyskać PID dla konkretnego programu?
Nikhil VJ

Odpowiedzi:

23

Aby zabić proces powiązany z wieloma procesami, musisz go zabić, używając identyfikatora procesu powiązanego z tym procesem.

Aby uzyskać identyfikator procesu dla tego procesu Java, należy go uruchomić

ps -A |grep java

wynik tej komendy wyświetli listę procesów Java uruchomionych w systemie. Zanotuj identyfikator procesu (PID) tego procesu, którego chcesz zabić i uruchomić

kill -9 PID
P4cK3tHuNt3R
źródło
Jeśli chcesz zabić WSZYSTKIE procesy Java za pomocą jednego poleceniaps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
Andrii Karaivanskyi
11

IMO najlepszym rozwiązaniem jest:

pkill -9 -f <nameOfYourJavaAplication>
Marek R.
źródło
Doskonały. Kiedyś ps -fC javaznajdowałem nameOfYourJavaAplication(in -Dprogram.name)
cactuschibre
8

Zamiast używać psi grepmożna użyć flagi ps„s”, -Caby wybrać wszystkie polecenia o nazwie „java”. Można również użyć ps„s -fflagę wydrukować pełną nazwę polecenia każdego wymienionego procesu. W ten sposób możesz zobaczyć, co faktycznie robi każdy proces Java. Oto komenda w całości: ps -fC java.

Możesz także użyć pgrepdo wyświetlenia listy wszystkich procesów Java. pgrep -a javazwróci PID i pełny wiersz poleceń każdego procesu Java.

Gdy masz PID polecenia chcesz zabić, korzystanie killz -9flagą (SIGKILL) i PID procesu java chcesz zabić. Java nie zawsze zatrzymuje się, gdy odbierze sygnał „SIGTERM” (procesy mogą obsługiwać „SIGTERM”), dlatego często konieczne jest wysłanie mu sygnału „SIGKILL”, który powoduje, że init zabija program bez uprzedniego ostrzeżenia.

Na przykład, jeśli ps -fC javazwraca

UID        PID  PPID  C STIME TTY          TIME CMD
jeff      9014  8890  0 08:51 pts/0    00:00:00 java IDE
jeff     11775  8890  6 08:59 pts/0    00:00:00 java TestProgram

lub psgrep -a javawraca

9014 java IDE
11775 java TestProgram

i chcesz zabić java TestProgram, powinieneś biec kill -9 11775.


źródło
1

Jeśli chcesz, aby skrypt znalazł i zabił (określony) działający program przy użyciu wzorca z wiersza poleceń programu (a nie tylko każdej uruchomionej rzeczy Java), to:

pgrep -f pattern # shows the PID
pkill -f pattern

Od /unix//a/31111/249209

Nikhil VJ
źródło
Zauważ, że „pkill” został już wspomniany w odpowiedzi Marka R z 13 lutego 2013 r.
Jeff Schaller
0

jpsi jcmdsą narzędziami wyspecjalizowanymi w wyświetlaniu tylko informacji o procesach Java i PID.

Możesz zbadać ich opcje, aby uzyskać bardziej szczegółowe wyniki.

Muhammad Gelbana
źródło
Te tylko same się wypisują na moim komputerze.
Alexis Wilke,
Czy na pewno działają inne procesy Java ?!
Muhammad Gelbana,
Tak. Podczas testowania twojego polecenia kazałem Cassandrze lub Elassadrze biegać.
Alexis Wilke,
0

Oto skrypt, którego można użyć do zautomatyzowania procesu.

Zastąp tę <PROCESS_NAME>część tym, co wykonuje Java.

#!/bin/sh
process=`ps -ef | grep -v awk | awk -e '/java.*<PROCESS_NAME>/ { print $2 }'`
kill ${process}

Uwaga: nie umieściłem -9. Nie powinienem być wymagany, chyba że przechwycisz sygnały i SIGTERM(domyślnie) zawiedzie. Sugeruję również użycie nazwy sygnału, która ułatwia odczytanie:

kill -TERM ${process}

OSTRZEŻENIE

Przed wykonaniem kill ...upewnij się, że $processzmienna zostanie ustawiona zgodnie z oczekiwaniami. ps -efMoże się różnić pomiędzy Unixach więc awkmoże trzeba wydrukować inny parametr.

Uwaga

<PROCESS_NAME>Można zmienić w zmiennej. Pamiętaj tylko, że jeśli będziesz musiał za każdym razem wpisywać go w wierszu poleceń, prawdopodobnie od czasu do czasu popełniasz błędy. Łatwiej jest mi mieć wiele kopii skryptu o poprawnej nazwie.

Ważne: zwróć uwagę na pojedyncze cytaty awkskryptu. Oznacza to, że musisz zamknąć i ponownie otworzyć ciąg ze zmienną pomiędzy. Coś takiego powinno działać (nieprzetestowane):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
Alexis Wilke
źródło