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 java
aber 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.
top
oderps
) und wählen Sie die richtige aus und töten Sie sie mit der PID (kill -9 PID_number).PID
. Vielen DankAntworten:
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
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
quelle
ps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
IMO ist die beste Lösung:
quelle
ps -fC java
zu findennameOfYourJavaAplication
(in-Dprogram.name
)Anstatt
ps
und zu verwendengrep
, können Sie das Flagps
's-C
verwenden, um alle Befehle auszuwählen, die mit dem Namen' java 'aufgeführt sind. Sie können auch verwendet werdenps
‚s --f
Flag 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,
pgrep
um alle Java-Prozesse aufzulisten.pgrep -a java
Gibt 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
kill
das-9
Flag (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 java
zurückkehrtoder
psgrep -a java
kehrt zurückund wenn du töten
java TestProgram
willst, solltest du weglaufenkill -9 11775
.quelle
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:
Von /unix//a/31111/249209
quelle
jps
undjcmd
sind Tools, die darauf spezialisiert sind, nur Java-Prozessinformationen und PIDs anzuzeigen.Sie können ihre Optionen für eine detailliertere Ausgabe erkunden.
quelle
Hier ist ein Skript, mit dem Sie den Prozess automatisieren können.
Ersetzen Sie das
<PROCESS_NAME>
Teil durch das, was Java ausführt.Hinweis: Ich habe das nicht gestellt
-9
. Ich sollte nicht benötigt werden, es sei denn, Sie erfassen Signale undSIGTERM
(die Standardeinstellung) schlägt fehl. Ich würde auch vorschlagen, dass Sie den Signalnamen verwenden, der das Lesen erleichtert:WARNUNG
Stellen Sie vor dem Ausführen von
kill ...
sicher, dass die$process
Variable wie erwartet gesetzt wird. Dieps -ef
Angaben können sich von Gerät zu Gerät unterscheiden, daher mussawk
mö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
awk
Skript. Das bedeutet, dass Sie die Zeichenfolge mit der dazwischen liegenden Variablen schließen und erneut öffnen müssen. So etwas sollte funktionieren (ungetestet):quelle