Comment puis-je lister tous les processus Java dans bash? J'ai besoin d'une ligne de commande. Je sais qu'il existe une commande ps
mais je ne sais pas quels paramètres je dois utiliser.
essayer:
ps aux | grep Java
et voyez comment vous vous en sortez
Les récents Java sont fournis avec Java Outil d'état du processus de la machine virtuelle "jps"
http://download.Oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
Par exemple,
[nsushkin@fulton support]$ jps -m
2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb
26546 charles.jar
17600 Jps -m
jps -lV
est le plus utile. Imprime juste le nom principal et qualifié de la classe:
2472 com.intellij.idea.Main
11111 Sun.tools.jps.Jps
9030 play.server.Server
2752 org.jetbrains.idea.maven.server.RemoteMavenServer
Vous pouvez également utiliser la commande unique pgrep (vous n'avez pas besoin d'utiliser de canaux ni de commandes multiples):
pgrep -fl Java
À partir de Java 7 , le moyen le plus simple et le moins sujet aux erreurs consiste à utiliser simplement la commande jcmd
qui fait partie du JDK de sorte que cela fonctionne de la même manière sur tous les systèmes d'exploitation.
Exemple:
> jcmd
5485 Sun.tools.jcmd.JCmd
2125 MyProgram
jcmd
permet d'envoyer des demandes de commande de diagnostic à une machine virtuelle (JVM) Java en cours d'exécution.
Plus de détails sur comment utiliser jcmd
.
Voir aussi l'utilitaire jcmd
Ceci renverra tous les processus Java en cours d'exécution dans l'environnement Linux. Ensuite, vous pouvez tuer le processus en utilisant l'ID de processus.
ps -e|grep Java
Pour un meilleur format de sortie, vérifiez cette commande:
ps -fC Java
ps aux | grep Java
ou
$ ps -fea|grep -i Java
Si je veux simplement lister les processus Java, utilisez:
ps -A | grep Java
pgrep -l Java
ps -ef | grep Java
Lorsque je veux savoir si une certaine classe Java est en cours d'exécution, j'utilise la ligne de commande suivante:
ps ww -f -C Java | grep "fully.qualified.name.of.class"
Dans la vue latérale du système d'exploitation, le nom de la commande du processus est "Java". L'option "ww" élargit le nombre maximal de caractères de la colonne, de sorte qu'il est possible de grep le FQN de la classe associée.
ps axuwww | grep Java | grep -v grep
La volonté ci-dessus
(d'ailleurs, cet exemple n'est pas efficace, mais simple à retenir);)
vous pouvez diriger ce qui précède vers d'autres commandes, par exemple:
ps axuwww | grep Java | grep -v grep | sed '.....' | while read something
do
something_another $something
done
etc...
jps & jcmd ne m'a montré aucun résultat lorsque je l'ai essayé en utilisant openjdk-1.8 sur linux redhat. Mais même s’il le faisait, il ne montre que les processus de l’utilisateur actuel qui ne fonctionnent pas dans mon cas. J'ai fini par utiliser ps | grep, mais le chemin d'accès aux classes de certaines applications Java peut être extrêmement long, ce qui rend les résultats illisibles. J'ai donc utilisé sed pour le supprimer. Ceci est encore un peu approximatif mais supprime tout sauf les éléments suivants: PID, utilisateur, classe Java/jar, arguments.
ps -o pid,user,cmd -C Java | sed -e 's/\([0-9]\+ *[^ ]*\) *[^ ]* *\([^$]*\)/\1 \2/' -e 's/-c[^ ]* [^ ]* \|-[^ ]* //g'
Les résultats ressemblent à quelque chose comme:
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
Une alternative sur Windows pour lister tous les processus est:
WMIC path win32_process where "Caption='Java.exe'" get ProcessId,Commandline
Mais il faudra un peu d’analyse pour le rendre plus lisible.
Il y a beaucoup de façons de faire cela. Vous pouvez utiliser Java.lang.ProcessBuilder
et "pgrep" pour obtenir l'ID de processus (PID) avec quelque chose comme: pgrep -fl Java | awk {'print $1'}
. Ou, si vous utilisez Linux, vous pouvez interroger le répertoire /proc
.
Je sais, cela semble horrible, et non portable, et même mal mis en œuvre, je suis d’accord. Mais parce que Java fonctionne réellement sur une machine virtuelle, pour une raison absurde que je ne puisse vraiment pas comprendre après plus de 15 ans d'utilisation du JDK, c'est pourquoi il est impossible de voir des éléments en dehors de l'espace JVM. C'est vraiment ridicule d'y penser. Vous pouvez faire tout le reste, même les processus fork
et join
(ceux-ci étaient une horrible méthode multitâche lorsque le monde ne connaissait pas les threads ou pthreads , qu'est-ce qui se passe avec Java?! :).
Cela va donner une immense discussion, je le sais, mais de toute façon, il y a une très bonne API que j'ai déjà utilisée dans mes projets et qui est suffisamment stable (, c'est un logiciel libre; vous devez donc toujours tester toutes les versions que vous utilisiez auparavant vraiment faire confiance à l'API ): https://github.com/jezhumble/javasysmon
JavaDoc: http://jezhumble.github.io/javasysmon/ , recherchez la classe com.jezhumble.javasysmon.OsProcess
, elle fera l'affaire. J'espère que ça vous a aidé, bonne chance.
ps -eaf | grep [j]ava
C'est mieux car il ne vous montrera que les processus actifs ne comprenant pas cette commande qui a également eu Java chaîne le []
fait l'affaire
J'utilise ceci (bien sur Debian 8): alias psj='ps --no-headers -ww -C Java -o pid,user,start_time,command'