Come posso elencare tutti i processi Java in bash? Ho bisogno di una riga di comando. So che esiste il comando ps
ma non so quali parametri devo usare.
provare:
ps aux | grep Java
e vedi come vai avanti
Recente Java viene fornito con Java Strumento di stato del processo della macchina virtuale "jps"
http://download.Oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
Per esempio,
[[email protected] support]$ jps -m
2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb
26546 charles.jar
17600 Jps -m
jps -lV
è molto utile. Stampa solo il nome della classe principale pid e qualificato:
2472 com.intellij.idea.Main
11111 Sun.tools.jps.Jps
9030 play.server.Server
2752 org.jetbrains.idea.maven.server.RemoteMavenServer
Puoi usare anche il comando singolo pgrep (non richiede l'uso di pipe e comandi multipli):
pgrep -fl Java
A partire da Java 7 , il modo più semplice e meno soggetto a errori è semplicemente usare il comando jcmd
che fa parte del JDK in modo tale 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 di diagnostica a una macchina virtuale (JVM) Javain esecuzione.
Maggiori dettagli su come usare jcmd
.
Vedi anche l'utilità jcmd
Ciò restituirà tutti i processi Java in esecuzione in ambiente Linux. Quindi è possibile interrompere il processo utilizzando l'ID processo.
ps -e|grep Java
Per un migliore formato di output selezionare questo comando:
ps -fC Java
ps aux | grep Java
o
$ ps -fea|grep -i Java
Se voglio semplicemente elencare Java processi, usare:
ps -A | grep Java
pgrep -l Java
ps -ef | grep Java
ps axuwww | grep Java | grep -v grep
Quanto sopra
(a proposito, questo esempio non è 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...
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" allarga i caratteri massimi della colonna, quindi è possibile greppare l'FQN della classe correlata.
jps & 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 funzionano nel mio caso. L'uso 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, Utente, 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.
Ci sono molti modi per farlo. È possibile utilizzare Java.lang.ProcessBuilder
e "pgrep" per ottenere l'ID processo (PID) con qualcosa del tipo: pgrep -fl Java | awk {'print $1'}
. Oppure, se si esegue su Linux, è possibile eseguire una query nella directory /proc
.
Lo so, questo sembra orribile, non portatile e persino mal implementato, sono d'accordo. Ma poiché Java funziona effettivamente in una VM, per qualche assurda ragione che non riesco davvero a capire dopo più di 15 anni di lavoro su JDK, è per questo che non è possibile vedere cose al di fuori dello spazio JVM , è davvero ridicolo se ci pensi. Puoi fare tutto il resto, anche i processi figlio fork
e join
(quelli erano un modo orribile di multitasking quando il mondo non era a conoscenza di thread o pthreads , che diavolo! che succede con Java ?! :).
Questo darà una discussione immensa che conosco, ma comunque, c'è un'API molto buona che ho già usato nei miei progetti ed è abbastanza stabile ( è OSS, quindi devi ancora sottoporre a stress test ogni versione che usi prima fidarsi davvero dell'API ): https://github.com/jezhumble/javasysmon
JavaDoc: http://jezhumble.github.io/javasysmon/ , cerca la classe com.jezhumble.javasysmon.OsProcess
, farà il trucco. Spero che abbia aiutato, buona fortuna.
ps -eaf | grep [j]ava
È meglio poiché ti mostrerà solo i processi attivi che non includono questo comando che ha anche Java stringa il []
fa il trucco
Lo uso (buono su Debian 8): alias psj='ps --no-headers -ww -C Java -o pid,user,start_time,command'