Como posso listar todos os processos Java no bash? Eu preciso de uma linha de comando. Eu sei que existe um comando, ps
mas não sei quais parâmetros preciso usar.
ps
, em seguida, tente primeiro man ps
, info ps
e aprender sobre ele na Internet.
Como posso listar todos os processos Java no bash? Eu preciso de uma linha de comando. Eu sei que existe um comando, ps
mas não sei quais parâmetros preciso usar.
ps
, em seguida, tente primeiro man ps
, info ps
e aprender sobre ele na Internet.
Respostas:
Java recente vem com a ferramenta Java Virtual Machine Process Status "jps"
http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
Por exemplo,
[nsushkin@fulton support]$ jps -m
2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb
26546 charles.jar
17600 Jps -m
jps -lV
é muito útil. Imprime apenas pid e nome de classe principal qualificado:
2472 com.intellij.idea.Main
11111 sun.tools.jps.Jps
9030 play.server.Server
2752 org.jetbrains.idea.maven.server.RemoteMavenServer
A partir do Java 7 , a maneira mais simples e menos sujeita a erros é simplesmente usar o comando jcmd
que faz parte do JDK forma que funcione da mesma maneira em todos os sistemas operacionais.
Exemplo:
> jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram
jcmd
permite enviar solicitações de comando de diagnóstico para uma Java Virtual Machine (JVM) em execução.
Mais detalhes sobre como usarjcmd
.
Veja também o jcmd
Utilitário
jps
Para um melhor formato de saída, verifique este comando:
ps -fC java
Isso retornará todos os processos Java em execução no ambiente linux. Em seguida, você pode encerrar o processo usando o ID do processo.
ps -e|grep java
ps aux | grep java
ou
$ ps -fea|grep -i java
Se eu quiser simplesmente listar os processos java, use:
ps -A | grep java
pgrep -l java
ps -ef | grep java
grep
processo?
ps axuwww | grep java | grep -v grep
O acima vai
(aliás, este exemplo não é eficaz, mas é simples de lembrar);)
você pode canalizar o acima para outros comandos, por exemplo:
ps axuwww | grep java | grep -v grep | sed '.....' | while read something
do
something_another $something
done
etc ...
Quando quero saber se uma determinada classe Java está sendo executada, uso a seguinte linha de comando:
ps ww -f -C java | grep "fully.qualified.name.of.class"
Na visão lateral do SO, o nome do comando do processo é "java". A opção "ww" alarga o máximo de caracteres da coluna, então é possível fazer um grep do FQN da classe relacionada.
$ top
apenas fornece "java" como o comando, o que não é muito útil ao tentar descobrir qual processo está monopolizando a CPU. $ ps ww -fC java
fornece as peças que faltam do quebra-cabeça.
jps e jcmd não estavam mostrando nenhum resultado quando tentei usando o openjdk-1.8 no redhat linux. Mas mesmo que isso acontecesse, ele só mostra processos sob o usuário atual, o que não funciona no meu caso. Usar o ps | grep é o que acabei fazendo, mas o caminho da classe para alguns aplicativos java pode ser extremamente longo, o que torna os resultados ilegíveis, então usei o sed para removê-lo. Isso ainda é um pouco grosseiro, mas remove tudo, exceto: PID, User, java-class / jar, args.
ps -o pid,user,cmd -C java | sed -e 's/\([0-9]\+ *[^ ]*\) *[^ ]* *\([^$]*\)/\1 \2/' -e 's/-c[^ ]* [^ ]* \|-[^ ]* //g'
Os resultados são semelhantes 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
Uma alternativa no Windows para listar todos os processos é:
WMIC path win32_process where "Caption='java.exe'" get ProcessId,Commandline
Mas isso vai precisar de alguma análise para torná-lo mais legível.
Existem muitas maneiras de fazer isso. Você pode usar java.lang.ProcessBuilder
e "pgrep" para obter o ID do processo (PID) com algo como: pgrep -fl java | awk {'print $1'}
. Ou, se você estiver executando no Linux, você pode consultar o/proc
diretório.
Eu sei, isso parece horrível e não portátil, e até mal implementado, eu concordo. Mas como o Java realmente roda em uma VM, por alguma razão absurda que não consigo entender depois de mais de 15 anos trabalhando no JDK, é por isso que não é possível ver as coisas fora do espaço da JVM, é realmente ridículo para você pense nisso. Você pode fazer tudo, mesmo fork
e join
processos filhos (aqueles eram uma maneira horrível de multitarefa quando o mundo não sabia sobre tópicos ou pthreads , o que é um inferno! O que está acontecendo em com Java ?! :).
Isso vai dar uma grande discussão, eu sei, mas de qualquer forma, há uma API muito boa que eu já usei em meus projetos e é estável o suficiente ( é OSS, então você ainda precisa testar cada versão que usar antes de realmente confiar na API ): https : //github.com/jezhumble/javasysmon
JavaDoc: http://jezhumble.github.io/javasysmon/ , procure a classe com.jezhumble.javasysmon.OsProcess
, ela fará o truque. Espero que tenha ajudado, boa sorte.
ps -eaf | grep [j]ava
É melhor porque só vai mostrar os processos ativos sem incluir este comando que também tem uma string java que []
faz o truque
Eu uso isso (bom no Debian 8):
alias psj='ps --no-headers -ww -C java -o pid,user,start_time,command'
Para saber a lista de java rodando na máquina linux. ps -e | grep java