Beenden Sie nur einen Java-Prozess

16

Normalerweise führe ich nur wenige Java-Anwendungen aus, eine für den lokalen Server und eine für einige IDE-Anwendungen wie NetBeans. Und von Zeit zu Zeit bleibt mein Server nach vielen erneuten Bereitstellungen in OutOfMemoryException hängen, sodass ich den Java-Prozess beenden muss, um einen Neustart durchzuführen.

Also tue ich es, pkill -9 javaaber dies tötet auch meine laufende IDE, die ich nicht möchte. Ich gehe davon aus, dass alle Anwendungen unter demselben Prozess ausgeführt werden, aber es muss eine Möglichkeit geben, sie zu unterscheiden.

Petr Mensik
quelle
2
Schauen Sie sich Ihre Prozesstabelle an (über topoder ps) und wählen Sie die richtige aus und töten Sie sie mit der PID (kill -9 PID_number).
Ansturm
Oh ja, das kann ich jetzt sehen. Also muss ich nur den Prozess mit richtig beenden PID. Vielen Dank
Petr Mensik
Ich muss das automatisieren. Wie erhalte ich die PID für das jeweilige Programm?
Nikhil VJ

Antworten:

22

Um einen Prozess zu beenden, der mehreren Prozessen zugeordnet ist, müssen Sie diesen mit der diesem Prozess zugeordneten Prozess-ID beenden.

Um die Prozess-ID dieses Java-Prozesses zu ermitteln, führen Sie diesen aus

ps -A |grep java

Die Ausgabe dieses Befehls gibt die Liste der auf Ihrem System ausgeführten Java-Prozesse an. Notieren Sie sich die Prozess-ID (PID) des Prozesses, den Sie beenden und ausführen möchten

kill -9 PID
P4cK3tHuNt3R
quelle
Wenn Sie ALLE Java-Prozesse mit einem Befehl ps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
beenden
11

IMO ist die beste Lösung:

pkill -9 -f <nameOfYourJavaAplication>
Marek R
quelle
Perfekt. Früher habe ich ps -fC javazu finden nameOfYourJavaAplication(in -Dprogram.name)
cactuschibre
8

Anstatt psund zu verwenden grep, können Sie das Flag ps's -Cverwenden, um alle Befehle auszuwählen, die mit dem Namen' java 'aufgeführt sind. Sie können auch verwendet werden ps‚s - -fFlag den vollständigen Befehlsnamen der einzelnen aufgeführten Verfahren zu drucken. Auf diese Weise können Sie sehen, was jeder Java-Prozess tatsächlich tut. Hier ist der Befehl in voller Länge: ps -fC java.

Sie können auch verwenden, pgrepum alle Java-Prozesse aufzulisten. pgrep -a javaGibt die PID und die vollständige Befehlszeile jedes Java-Prozesses zurück.

Sobald Sie die PID des Befehls haben, den Sie beenden möchten, verwenden Sie killdas -9Flag (SIGKILL) und die PID des Java-Prozesses, den Sie beenden möchten. Java stoppt nicht immer, wenn es ein 'SIGTERM'-Signal empfängt (Prozesse dürfen' SIGTERM 'verarbeiten). Daher ist es oft notwendig, das' SIGKILL'-Signal zu senden, das init veranlasst, das Programm zu beenden, ohne es vorher zu warnen.

Zum Beispiel, wenn ps -fC javazurückkehrt

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

oder psgrep -a javakehrt zurück

9014 java IDE
11775 java TestProgram

und wenn du töten java TestProgramwillst, solltest du weglaufen kill -9 11775.


quelle
1

Wenn Sie möchten, dass ein Skript Ihr (spezifisches) laufendes Programm anhand eines Musters in der Befehlszeile des Programms findet und beendet (und nicht nur jedes Java-Objekt, das Sie ausgeführt haben), dann:

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

Von /unix//a/31111/249209

Nikhil VJ
quelle
Beachten Sie, dass "pkill" bereits in Marek Rs Antwort vom 13. Februar 13 erwähnt wurde
Jeff Schaller
0

jpsund jcmdsind Tools, die darauf spezialisiert sind, nur Java-Prozessinformationen und PIDs anzuzeigen.

Sie können ihre Optionen für eine detailliertere Ausgabe erkunden.

Muhammad Gelbana
quelle
Die verzeichnen sich nur auf meinem Computer.
Alexis Wilke
Sind Sie dann sicher, dass andere Java-Prozesse ausgeführt werden?
Muhammad Gelbana
Ja. Ich hatte Cassandra oder Elassadra am Laufen, als ich dein Kommando getestet habe.
Alexis Wilke
0

Hier ist ein Skript, mit dem Sie den Prozess automatisieren können.

Ersetzen Sie das <PROCESS_NAME>Teil durch das, was Java ausführt.

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

Hinweis: Ich habe das nicht gestellt -9. Ich sollte nicht benötigt werden, es sei denn, Sie erfassen Signale und SIGTERM(die Standardeinstellung) schlägt fehl. Ich würde auch vorschlagen, dass Sie den Signalnamen verwenden, der das Lesen erleichtert:

kill -TERM ${process}

WARNUNG

Stellen Sie vor dem Ausführen von kill ...sicher, dass die $processVariable wie erwartet gesetzt wird. Die ps -efAngaben können sich von Gerät zu Gerät unterscheiden, daher muss awkmöglicherweise ein anderer Parameter gedruckt werden.

Hinweis

Das <PROCESS_NAME>könnte in eine Variable geändert werden. Denken Sie daran, dass Sie gelegentlich Fehler machen können, wenn Sie sie jedes Mal in die Befehlszeile eingeben müssen. Ich finde es einfacher, mehrere Kopien des Skripts mit dem richtigen Namen zu haben.

Ebenfalls wichtig: Beachten Sie die einfachen Anführungszeichen für das awkSkript. Das bedeutet, dass Sie die Zeichenfolge mit der dazwischen liegenden Variablen schließen und erneut öffnen müssen. So etwas sollte funktionieren (ungetestet):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
Alexis Wilke
quelle