¿Cómo puedo enumerar todos los procesos de Java en bash? Necesito una línea de comando. Sé que hay un comando, ps
pero no sé qué parámetros necesito usar.
ps
a continuación, en primer lugar tratar man ps
, info ps
y aprender sobre él en Internet.
¿Cómo puedo enumerar todos los procesos de Java en bash? Necesito una línea de comando. Sé que hay un comando, ps
pero no sé qué parámetros necesito usar.
ps
a continuación, en primer lugar tratar man ps
, info ps
y aprender sobre él en Internet.
Respuestas:
Java reciente viene con Java Virtual Machine Process Status Tool "jps"
http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
Por ejemplo,
[nsushkin@fulton support]$ jps -m
2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb
26546 charles.jar
17600 Jps -m
jps -lV
es más útil. Imprime solo pid y nombre de clase principal calificado:
2472 com.intellij.idea.Main
11111 sun.tools.jps.Jps
9030 play.server.Server
2752 org.jetbrains.idea.maven.server.RemoteMavenServer
A partir de Java 7 , la forma más sencilla y menos propensa a errores es simplemente usar el comando jcmd
que es parte del JDK de manera que funcione de la misma manera en todos los sistemas operativos.
Ejemplo:
> jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram
jcmd
permite enviar solicitudes de comandos de diagnóstico a una máquina virtual Java (JVM) en ejecución.
Más detalles sobre cómo utilizarjcmd
.
Ver también la jcmd
utilidad
jps
Para un mejor formato de salida, marque este comando:
ps -fC java
Esto devolverá todos los procesos de Java en ejecución en el entorno Linux. Entonces puede matar el proceso usando el ID de proceso.
ps -e|grep java
ps aux | grep java
o
$ ps -fea|grep -i java
Si quiero simplemente enumerar los procesos de Java, use:
ps -A | grep java
pgrep -l java
ps -ef | grep java
grep
proceso?
ps axuwww | grep java | grep -v grep
Lo anterior
(por cierto, este ejemplo no es el efectivo, pero es fácil de recordar);)
puede canalizar lo anterior a otros comandos, por ejemplo:
ps axuwww | grep java | grep -v grep | sed '.....' | while read something
do
something_another $something
done
etc ...
Cuando quiero saber si una determinada clase de Java se está ejecutando, uso la siguiente línea de comando:
ps ww -f -C java | grep "fully.qualified.name.of.class"
Desde la vista lateral del sistema operativo, el nombre del comando del proceso es "java". La opción "ww" amplía el máximo de caracteres de la columna, por lo que es posible grep del FQN de la clase relacionada.
$ top
simplemente da "java" como el comando que no es tan útil cuando se trata de averiguar qué proceso está acaparando la CPU. $ ps ww -fC java
proporciona las piezas faltantes del rompecabezas.
jps & jcmd no me mostraba ningún resultado cuando lo probé usando openjdk-1.8 en redhat linux. Pero incluso si lo hiciera, solo muestra procesos bajo el usuario actual que no funciona en mi caso. Usar ps | grep es lo que terminé haciendo, pero la ruta de clases para algunas aplicaciones Java puede ser extremadamente larga, lo que hace que los resultados sean ilegibles, así que usé sed para eliminarlo. Esto es un poco difícil todavía, pero elimina todo excepto: PID, Usuario, clase java / jar, args.
ps -o pid,user,cmd -C java | sed -e 's/\([0-9]\+ *[^ ]*\) *[^ ]* *\([^$]*\)/\1 \2/' -e 's/-c[^ ]* [^ ]* \|-[^ ]* //g'
Los resultados se parecen 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
Una alternativa en Windows para enumerar todos los procesos es:
WMIC path win32_process where "Caption='java.exe'" get ProcessId,Commandline
Pero eso necesitará un poco de análisis para hacerlo más legible.
Hay muchas formas de hacer esto. Puede utilizar java.lang.ProcessBuilder
y "pgrep" para obtener el identificador de proceso (PID) con algo como: pgrep -fl java | awk {'print $1'}
. O, si está ejecutando en Linux, puede consultar el /proc
directorio.
Lo sé, esto parece horrible y no portátil, e incluso mal implementado, estoy de acuerdo. Pero debido a que Java realmente se ejecuta en una máquina virtual, por alguna razón absurda que realmente no puedo entender después de más de 15 años trabajando en el JDK, es por qué no es posible ver cosas fuera del espacio JVM, es realmente ridículo para ti. Piénsalo. Puede hacer todo lo demás, incluso fork
y join
procesos secundarios (aquellos eran una manera horrible de la multitarea cuando el mundo no sabía nada de las discusiones o pthreads , lo que es un infierno! ¿Qué está pasando en un sobre con Java ?! :).
Esto dará una discusión inmensa, lo sé, pero de todos modos, hay una API muy buena que ya utilicé en mis proyectos y es lo suficientemente estable ( es OSS, por lo que aún necesita probar cada versión que usa antes de confiar realmente en la API ): https : //github.com/jezhumble/javasysmon
JavaDoc: http://jezhumble.github.io/javasysmon/ , busque la clase com.jezhumble.javasysmon.OsProcess
, ella hará el truco. Espero que haya ayudado, mucha suerte.
ps -eaf | grep [j]ava
Es mejor ya que solo le mostrará los procesos activos sin incluir este comando que también obtuvo una cadena java que []
hace el truco
Yo uso esto (bueno en Debian 8):
alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'
Para conocer la lista de Java que se ejecuta en la máquina Linux. ps -e | grep java