Beenden Sie Java-Prozesse

25

Ich arbeite an einem rechenintensiven Code, der vorerst häufig abstürzt, aber ich arbeite immer noch daran :) Wenn er abstürzt, kann ich das GUI-Fenster nicht schließen. Ich muss eine Shell öffnen und den Prozess beenden.

Es ist ein Java-Prozess und leicht zu finden:

nkint@zefiro:~$ ps aux | grep java
nkint   2705 16.6  1.0 460928 43680 ?        Sl   12:23   0:08 /usr/lib/jvm/java-6-sun-1.6.0.26/bin/java -Djava.library.path=something something
nkint   2809  0.0  0.0   4012   776 pts/0    S+   12:24   0:00 grep --color=auto java
nkint@zefiro:~$ kill -9 2705

Jetzt ist es einfach, aber eine ziemliche mechanische Aufgabe. Normalerweise warte ich, bis ungefähr 7-8 Prozesse zum Absturz gebracht sind, und dann kill -9jeder von ihnen.

Ich möchte dies automatisch tun. Ich denke, dass es einfach sein sollte, einige Befehle zu übermitteln, um die ID der (n-1) -Ergebnisse zu ermitteln ps aux | grep javaund zu töten, aber ich habe keine Ahnung, wo ich anfangen soll.

Kann mir jemand einen Tipp geben?

nkint
quelle

Antworten:

22

Ein paar Pfeifen bringen Sie dorthin, wo Sie wollen. So würde ich es machen:

search_terms='whatever will help find the specific process' 

kill $(ps aux | grep "$search_terms" | grep -v 'grep' | awk '{print $2}')

Folgendes passiert:

grep -v 'grep' Schließt den Grep-Prozess aus den Ergebnissen aus.

awk '{print $2}' druckt nur die 2. Spalte der Ausgabe (in diesem Fall die PID)

$(...)ist die Befehlsersetzung. Grundsätzlich wird das Ergebnis des inneren Befehls als Argument für verwendetkill

Dies hat den Vorteil einer genaueren Kontrolle darüber, was getötet wird. Wenn Sie sich beispielsweise auf einem gemeinsam genutzten System befinden, können Sie die Suchbegriffe so bearbeiten, dass nur versucht wird, Ihre eigenen Java-Prozesse zu beenden.

Dean
quelle
49

Wenn Sie alle genannten Prozesse beenden möchten, javakönnen Sie den folgenden Befehl verwenden:

killall -9 java

Dieser Befehl sendet Signale an Prozesse, die anhand ihres Namens identifiziert werden.

Milan Todorovic
quelle
killall javaIch habe aus irgendeinem Grund, den ich nicht lösen konnte, nicht für mich gearbeitet. Der -9Parameter sorgte dafür. Vielen Dank.
Paul Nelson Baker
5
9 ist SIGKILL. Das Programm kann es nicht ignorieren und sagt im Grunde: Beende dich jetzt.
Milan Todorovic
IntelliJ-Benutzer können feststellen, dass ihre IDE abgestürzt ist, ganz zu schweigen von Tomcat und vielen anderen Apps. Dies ist ein brachialer Weg und wird auf keinem System empfohlen, auf dem Dienste oder Produktivitäts-Apps basieren java.
9.
3

Öffne einen Texteditor und speichere dieses kurze Bash-Skript in deinem Home-Verzeichnis als 'killjava'

#! /bin/bash

# Kill Java process

# Determine the pid
PID=`ps -C java -o pid=`

kill -9 $PID

Dann chmod u+x ~/killjavain einem Terminal, damit Sie die Datei ausführen können.

Dann können Sie einfach ~/killjavavon einem Terminal aus anrufen, und Ihr Java-Prozess ist völlig erledigt. Möglicherweise möchten Sie überlegen, welche anderen Ressourcen das Beenden des Java-Prozesses auf diese Weise (z. B. Datenbankverbindungen) beeinflusst. Zum Beispiel kill -15wäre vielleicht besser geeignet - siehe die Erklärung hier .

Clive van Hilten
quelle
2

Hier ist ein alternativer Ansatz, der auf der früheren Antwort von @ Dean basiert.

Dies verwendet JPS , um den Java-Prozess zu identifizieren.

kill $(jps | grep <MainClass> | awk '{print $1}')

MainClass ist eine Klasse in Ihrem laufenden Java-Programm, die die main-Methode enthält.

Pawan
quelle