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 java
ale 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.
top
lubps
) i wybierz właściwą i zabij ją za pomocą PID (kill -9 PID_number).PID
.Odpowiedzi:
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ć
wynik tej komendy wyświetli listę procesów Java uruchomionych w systemie. Zanotuj identyfikator procesu (PID) tego procesu, którego chcesz zabić i uruchomić
źródło
ps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
IMO najlepszym rozwiązaniem jest:
źródło
ps -fC java
znajdowałemnameOfYourJavaAplication
(in-Dprogram.name
)Zamiast używać
ps
igrep
można użyć flagips
„s”,-C
aby wybrać wszystkie polecenia o nazwie „java”. Można również użyćps
„s-f
flagę 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ć
pgrep
do wyświetlenia listy wszystkich procesów Java.pgrep -a java
zwróci PID i pełny wiersz poleceń każdego procesu Java.Gdy masz PID polecenia chcesz zabić, korzystanie
kill
z-9
flagą (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 java
zwracalub
psgrep -a java
wracai chcesz zabić
java TestProgram
, powinieneś bieckill -9 11775
.źródło
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:
Od /unix//a/31111/249209
źródło
jps
ijcmd
są narzędziami wyspecjalizowanymi w wyświetlaniu tylko informacji o procesach Java i PID.Możesz zbadać ich opcje, aby uzyskać bardziej szczegółowe wyniki.
źródło
Oto skrypt, którego można użyć do zautomatyzowania procesu.
Zastąp tę
<PROCESS_NAME>
część tym, co wykonuje Java.Uwaga: nie umieściłem
-9
. Nie powinienem być wymagany, chyba że przechwycisz sygnały iSIGTERM
(domyślnie) zawiedzie. Sugeruję również użycie nazwy sygnału, która ułatwia odczytanie:OSTRZEŻENIE
Przed wykonaniem
kill ...
upewnij się, że$process
zmienna zostanie ustawiona zgodnie z oczekiwaniami.ps -ef
Może się różnić pomiędzy Unixach więcawk
moż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
awk
skryptu. Oznacza to, że musisz zamknąć i ponownie otworzyć ciąg ze zmienną pomiędzy. Coś takiego powinno działać (nieprzetestowane):źródło