Come posso elencare tutti i processi Java in bash? Ho bisogno di una riga di comando. So che esiste un comando ps
ma non so quali parametri devo usare.
ps
prova prima e impara a conoscerlo su Internet. man ps
info ps
Come posso elencare tutti i processi Java in bash? Ho bisogno di una riga di comando. So che esiste un comando ps
ma non so quali parametri devo usare.
ps
prova prima e impara a conoscerlo su Internet. man ps
info ps
Risposte:
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
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
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' jcmd
utilità
jps
Per un migliore formato di output controlla questo comando:
ps -fC java
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
ps aux | grep java
o
$ ps -fea|grep -i java
Se voglio semplicemente elencare i processi java, usa:
ps -A | grep java
pgrep -l java
ps -ef | grep java
grep
processo?
ps axuwww | grep java | grep -v grep
Quanto sopra lo farà
(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...
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.
$ top
dà solo "java" come comando che non è molto utile quando si cerca di capire quale processo sta monopolizzando la CPU. $ ps ww -fC java
fornisce i pezzi mancanti del puzzle.
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.
Ci sono molti modi per farlo. È possibile utilizzare java.lang.ProcessBuilder
e "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 /proc
directory.
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 fork
e join
processi 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.
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
Lo uso (buono su Debian 8):
alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'
Per conoscere l'elenco dei java in esecuzione sulla macchina Linux. ps -e | grep java