Liste der Java-Prozesse

113

Wie kann ich alle Java-Prozesse in bash auflisten? Ich brauche eine Kommandozeile. Ich weiß, dass es einen Befehl gibt, psaber ich weiß nicht, welche Parameter ich verwenden muss.

Jacek Koralik
quelle
1
Bitte zeigen Sie etwas mehr Aufwand, um dies zu untersuchen und Ihr Problem zu beschreiben. Es gibt viele Möglichkeiten, je nachdem, was genau Sie suchen.
Mat
3
Wenn Sie wissen , gibt es psdann zuerst versuchen man ps, info psund über sie im Internet lernen.
Ssapkota

Antworten:

148

Versuchen:

ps aux | grep java

und sehen, wie es dir geht

Reich
quelle
109

Neuere Java wird mit dem Java Virtual Machine Process Status Tool "jps" geliefert.

http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html

Beispielsweise,

[nsushkin@fulton support]$ jps -m
2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb
26546 charles.jar
17600 Jps -m
Nicholas Sushkin
quelle
2
Nur eine Anmerkung: jps wird nur mit dem JDK ausgeliefert, nicht mit dem JRE. Maschinen mit einfachen alten Java-Laufzeiten verfügen nicht über dieses Tool.
Aguazales
Wie kann ich nur zählen, wie der Java-Prozess ausgeführt wird?
Jet
50
jps -lV

ist am nützlichsten. Druckt nur pid und qualifizierten Hauptklassennamen:

2472 com.intellij.idea.Main
11111 sun.tools.jps.Jps
9030 play.server.Server
2752 org.jetbrains.idea.maven.server.RemoteMavenServer
verzinnte_Sardine
quelle
31

Sie können auch einen einzelnen Befehl pgrep verwenden (Sie müssen keine Pipes und mehrere Befehle verwenden):

pgrep -fl java
Anubhava
quelle
27

Ab Java 7 besteht der einfachste und weniger fehleranfällige Weg darin, einfach den Befehl zu verwenden jcmd , der Teil des JDK ist , sodass er auf allen Betriebssystemen auf die gleiche Weise funktioniert.

Beispiel:

> jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram

jcmd Ermöglicht das Senden von Diagnosebefehlsanforderungen an eine laufende Java Virtual Machine (JVM).

Weitere Details zur Verwendungjcmd .

Siehe auch das jcmdDienstprogramm

Nicolas Filotto
quelle
1
Wow, das ist noch besser alsjps
Sridhar Sarnobat
15

Überprüfen Sie für ein besseres Ausgabeformat diesen Befehl:

ps -fC java
Marcel Bernic
quelle
Schön eine saubere Ausgabe; genau das, wonach ich gesucht habe. Vielen Dank!
Charles Naccio
12

Dadurch werden alle laufenden Java-Prozesse in der Linux-Umgebung zurückgegeben. Anschließend können Sie den Prozess mithilfe der Prozess-ID beenden.

ps -e|grep java
Jude Niroshan
quelle
10

ps aux | grep java

oder

$ ps -fea|grep -i java

Shivendra Prakash Shukla
quelle
6

Wenn ich einfach Java-Prozesse auflisten möchte, verwenden Sie:

ps -A | grep java
krzysiek.ste
quelle
5
pgrep -l java
ps -ef | grep java
Vaquar Khan
quelle
5
Vielen Dank für dieses Code-Snippet, das möglicherweise sofortige Hilfe bietet. Eine richtige Erklärung würde den Bildungswert erheblich verbessern , indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und sie für zukünftige Leser mit ähnlichen, aber nicht identischen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, und geben Sie an, welche Einschränkungen und Annahmen gelten. Warum zeigt der zweite nicht den grepProzess?
Toby Speight
4
ps axuwww | grep java | grep -v grep

Das obige wird

  • zeigen Ihnen alle Prozesse mit langen Schlangen (arg: www)
  • filter (grep) nur Zeilen, die das Wort Java enthalten, und
  • Filtere die Zeile "grep java" aus :)

(Übrigens ist dieses Beispiel nicht das effektive, aber einfach zu merken);)

Sie können das oben Gesagte an andere Befehle weiterleiten, zum Beispiel:

ps axuwww | grep java | grep -v grep | sed '.....'  | while read something
do
    something_another $something
done

etc...

jm666
quelle
3

Wenn ich wissen möchte, ob eine bestimmte Java-Klasse ausgeführt wird, verwende ich die folgende Befehlszeile:

ps ww -f -C java | grep "fully.qualified.name.of.class"

In der Seitenansicht des Betriebssystems lautet der Befehlsname des Prozesses "Java". Die Option "ww" erweitert die maximale Anzahl der Zeichen in der Spalte, sodass der FQN der zugehörigen Klasse erfasst werden kann.

Airbjorn
quelle
Dies ist, wonach ich gesucht habe - $ topgibt nur "Java" als Befehl an, was nicht allzu hilfreich ist, wenn man herausfinden will, welcher Prozess die CPU belastet. $ ps ww -fC javaliefert die fehlenden Teile des Puzzles.
David Clarke
2

jps & jcmd zeigte mir keine Ergebnisse, als ich es mit openjdk-1.8 unter redhat linux versuchte. Aber selbst wenn dies der Fall wäre, werden nur Prozesse unter dem aktuellen Benutzer angezeigt, was in meinem Fall nicht funktioniert. Am Ende habe ich ps | grep verwendet, aber der Klassenpfad für einige Java-Apps kann extrem lang sein, wodurch die Ergebnisse unleserlich werden. Deshalb habe ich sed verwendet, um sie zu entfernen. Dies ist immer noch etwas rau, entfernt aber alles außer: PID, User, Java-Klasse / JAR, Argumente.

ps -o pid,user,cmd -C java | sed -e 's/\([0-9]\+ *[^ ]*\) *[^ ]* *\([^$]*\)/\1 \2/' -e 's/-c[^ ]* [^ ]* \|-[^ ]* //g'

Die Ergebnisse sehen ungefähr so ​​aus:

  PID USER     CMD
11251 userb org.apache.zookeeper.server.quorum.QuorumPeerMain ../config/zookeeper.properties
19574 userb com.intellij.idea.Main
28807 root org.apache.nifi.bootstrap.RunNiFi run
28829 root org.apache.nifi.NiFi

Eine Alternative unter Windows zum Auflisten aller Prozesse ist:

WMIC path win32_process where "Caption='java.exe'" get ProcessId,Commandline

Aber das muss analysiert werden, damit es besser lesbar ist.

Mike
quelle
1

Es gibt viele Möglichkeiten, dies zu tun. Sie können java.lang.ProcessBuilderund "pgrep" verwenden, um die Prozess-ID (PID) mit etwas wie: zu erhalten pgrep -fl java | awk {'print $1'}. Wenn Sie unter Linux arbeiten, können Sie das /procVerzeichnis auch abfragen .

Ich weiß, das scheint schrecklich und nicht portabel und sogar schlecht implementiert, da stimme ich zu. Aber weil Java tatsächlich in einer VM läuft, aus irgendeinem absurden Grund, den ich nach mehr als 15 Jahren Arbeit im JDK nicht wirklich herausfinden kann, ist es für Sie wirklich lächerlich, Dinge außerhalb des JVM-Bereichs zu sehen Denk darüber nach. Sie können alles andere tun, auch forkund joinuntergeordnete Prozesse (das war eine schreckliche Art des Multitasking, als die Welt nichts über Threads oder Pthreads wusste , was zum Teufel! Was ist mit Java los?! :).

Dies wird eine immense Diskussion geben, die ich kenne, aber es gibt trotzdem eine sehr gute API, die ich bereits in meinen Projekten verwendet habe und die stabil genug ist ( es ist OSS, so dass Sie immer noch jede Version testen müssen, die Sie verwenden, bevor Sie der API wirklich vertrauen ): https : //github.com/jezhumble/javasysmon

JavaDoc: http://jezhumble.github.io/javasysmon/ , suche nach der Klasse com.jezhumble.javasysmon.OsProcess, sie wird den Trick machen. Hoffe es hat geholfen, viel Glück.

jbrios777
quelle
1
 ps -eaf | grep [j]ava

Es ist besser, da es nur die aktiven Prozesse anzeigt, die diesen Befehl nicht enthalten, der auch Java-Zeichenfolgen []enthält, die den Trick ausführen

Ilya Gazman
quelle
es sollte ps -eaf | sein grep Java nicht [j] ava
vaquar khan
@vaquarkhan Alter versuchen Sie einfach, sowohl Ihre als auch meine Vorschläge auszuführen und zu sehen, was der Unterschied ist, beide werden funktionieren
Ilya Gazman
Beide geben die gleichen Ergebnisse, aber [j] ava ist verwirrend
vaquar khan
0

Ich benutze dies (gut auf Debian 8): alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'

Laurent Caillette
quelle
-1

Um die Liste von Java zu kennen, die auf dem Linux-Computer ausgeführt wird. ps -e | grep java

kiran jallepalli
quelle