Elenco dei processi Java


113

Come posso elencare tutti i processi Java in bash? Ho bisogno di una riga di comando. So che esiste un comando psma non so quali parametri devo usare.


1
per favore mostra un po 'più di impegno nella ricerca di questo e nella descrizione del tuo problema, ci sono molte possibilità a seconda di cosa stai cercando esattamente.
Mat

3
Se sai che c'è , psprova prima e impara a conoscerlo su Internet. man psinfo ps
ssapkota

Risposte:


148

provare:

ps aux | grep java

e guarda come vai avanti


109

Java recente viene fornito con Java Virtual Machine Process Status Tool "jps"

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

Per esempio,

[nsushkin@fulton support]$ jps -m
2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb
26546 charles.jar
17600 Jps -m

2
Solo una nota: jps viene fornito solo con JDK, non con JRE. Le macchine con semplici runtime Java su di esse non avranno questo strumento.
aguazales

come posso ottenere solo il conteggio dell'esecuzione del processo Java?
Jet

50
jps -lV

è molto utile. Stampa solo pid e il nome della classe principale qualificato:

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

31

Puoi anche usare il comando singolo pgrep (non richiede l'uso di pipe e comandi multipli):

pgrep -fl java

27

A partire da Java 7 , il modo più semplice e meno soggetto a errori è semplicemente utilizzare il comando jcmd che fa parte del JDK in modo che funzioni allo stesso modo su tutti i sistemi operativi.

Esempio:

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

jcmd consente di inviare richieste di comandi diagnostici a una JVM (Java Virtual Machine) in esecuzione.

Maggiori dettagli su come utilizzarejcmd .

Vedi anche l' jcmdutilità


1
Wow, è anche meglio dijps
Sridhar Sarnobat

15

Per un migliore formato di output controlla questo comando:

ps -fC java

Bello un risultato pulito; esattamente quello che stavo cercando. Grazie!
Charles Naccio

12

Questo restituirà tutti i processi java in esecuzione in ambiente Linux. Quindi puoi terminare il processo utilizzando l'ID del processo.

ps -e|grep java


6

Se voglio semplicemente elencare i processi java, usa:

ps -A | grep java

5
pgrep -l java
ps -ef | grep java

5
Grazie per questo snippet di codice, che potrebbe fornire un aiuto immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore educativo mostrando perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con domande simili, ma non identiche. Si prega di modificare la risposta di aggiungere una spiegazione, e dare un'indicazione di ciò si applicano le limitazioni e le assunzioni. In particolare, perché il secondo di questi non mostra il grepprocesso?
Toby Speight

4
ps axuwww | grep java | grep -v grep

Quanto sopra lo farà

  • mostra tutti i processi con lunghe code (arg: www)
  • filter (grep) solo le righe che contengono la parola java e
  • filtra la riga "grep java" :)

(btw, questo esempio non è quello efficace, ma semplice da ricordare);)

puoi reindirizzare quanto sopra ad altri comandi, ad esempio:

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

eccetera...


3

Quando voglio sapere se una determinata classe Java viene eseguita, utilizzo la seguente riga di comando:

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

Dalla vista laterale del sistema operativo, il nome del comando del processo è "java". L'opzione "ww" amplia il numero massimo di caratteri della colonna, quindi è possibile grep il FQN della relativa classe.


Questo è quello che stavo cercando - $ topdà solo "java" come comando che non è molto utile quando si cerca di capire quale processo sta monopolizzando la CPU. $ ps ww -fC javafornisce i pezzi mancanti del puzzle.
David Clarke

2

jps e jcmd non mi mostravano alcun risultato quando l'ho provato usando openjdk-1.8 su redhat linux. Ma anche se lo facesse, mostra solo i processi sotto l'utente corrente che non funziona nel mio caso. L'utilizzo di ps | grep è quello che ho finito per fare, ma il percorso di classe per alcune app java può essere estremamente lungo, il che rende i risultati illeggibili, quindi ho usato sed per rimuoverlo. Questo è ancora un po 'approssimativo ma rimuove tutto tranne: PID, User, java-class / jar, args.

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

I risultati assomigliano a:

  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

Un'alternativa su Windows per elencare tutti i processi è:

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

Ma sarà necessario un po 'di analisi per renderlo più leggibile.


1

Ci sono molti modi per farlo. È possibile utilizzare java.lang.ProcessBuildere "pgrep" per ottenere l'ID di processo (PID) con qualcosa come: pgrep -fl java | awk {'print $1'}. Oppure, se stai utilizzando Linux, puoi interrogare la /procdirectory.

Lo so, questo sembra orribile e non portatile e anche mal implementato, sono d'accordo. Ma poiché Java in realtà viene eseguito in una VM, per qualche motivo assurdo che non riesco davvero a capire dopo più di 15 anni di lavoro con JDK, è perché non è possibile vedere le cose al di fuori dello spazio JVM, è davvero ridicolo con te pensaci. Si può fare tutto il resto, anche forke joinprocessi figli (quelli erano un modo orribile di multitasking in cui il mondo non sapeva discussioni o pthreads , che inferno! Che cosa sta succedendo in su con Java ?! :).

Questo darà una discussione immensa, lo so, ma comunque c'è un'ottima API che ho già usato nei miei progetti ed è abbastanza stabile ( è OSS quindi devi ancora testare ogni versione che usi prima di fidarti davvero dell'API ): https : //github.com/jezhumble/javasysmon

JavaDoc: http://jezhumble.github.io/javasysmon/ , cerca la classe com.jezhumble.javasysmon.OsProcess, lei farà il trucco. Spero sia stato d'aiuto, buona fortuna.


1
 ps -eaf | grep [j]ava

È meglio poiché ti mostrerà solo i processi attivi escluso questo comando che ha anche una stringa java che []fa il trucco


dovrebbe essere ps -eaf | grep Java non [j] ava
vaquar khan

@vaquarkhan tizio prova a eseguire sia i tuoi che i miei suggerimenti e vedi qual è la differenza, entrambi funzioneranno
Ilya Gazman

Entrambi danno gli stessi risultati, tuttavia [j] ava è
fonte di

0

Lo uso (buono su Debian 8): alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'


-1

Per conoscere l'elenco dei java in esecuzione sulla macchina Linux. ps -e | grep java

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.