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.


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

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>

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.



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.


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 }'`
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.