如何在bash中列出所有Java进程?我需要一个命令行。我知道有命令,ps
但是我不知道需要使用哪些参数。
ps
那么请首先尝试man ps
,然后info ps
在Internet上了解它。
如何在bash中列出所有Java进程?我需要一个命令行。我知道有命令,ps
但是我不知道需要使用哪些参数。
ps
那么请首先尝试man ps
,然后info ps
在Internet上了解它。
Answers:
最新的Java随附Java虚拟机进程状态工具“ jps”
http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
例如,
[nsushkin@fulton support]$ jps -m
2120 Main --userdir /home/nsushkin/.netbeans/7.0 --branding nb
26546 charles.jar
17600 Jps -m
jps -lV
最有用。仅输出pid和合格的主类名称:
2472 com.intellij.idea.Main
11111 sun.tools.jps.Jps
9030 play.server.Server
2752 org.jetbrains.idea.maven.server.RemoteMavenServer
从Java 7开始,最简单的方法和更不易出错的方法是简单地使用jcmd
JDK中包含的命令,以便在所有OS上都可以以相同的方式工作。
例:
> jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram
jcmd
允许将诊断命令请求发送到正在运行的Java虚拟机(JVM)。
有关如何使用的jcmd
更多详细信息。
另请参见该jcmd
实用程序
jps
这将返回Linux环境中所有正在运行的Java进程。然后,您可以使用进程ID终止该进程。
ps -e|grep java
ps aux | grep java
要么
$ ps -fea|grep -i java
如果我只想列出Java进程,请使用:
ps -A | grep java
pgrep -l java
ps -ef | grep java
grep
当我想知道某个Java类是否正在执行时,我使用以下命令行:
ps ww -f -C java | grep "fully.qualified.name.of.class"
从操作系统的角度来看,该进程的命令名称为“ java”。“ ww”选项扩大了列的最大字符,因此可以grep相关类的FQN。
$ top
仅给出“ java”作为命令,当试图找出哪个进程在占用CPU时并没有太大帮助。$ ps ww -fC java
提供拼图的缺失部分。
当我在Redhat Linux上使用openjdk-1.8尝试使用jps和jcmd时,没有显示任何结果。但是即使这样做,它也只会显示当前用户下的进程,在我的情况下不起作用。我最终使用ps | grep进行操作,但是某些Java应用程序的类路径可能非常长,这使得结果难以理解,因此我使用sed将其删除。这仍然有些粗糙,但删除了所有内容,但:PID,用户,java-class / jar,args。
ps -o pid,user,cmd -C java | sed -e 's/\([0-9]\+ *[^ ]*\) *[^ ]* *\([^$]*\)/\1 \2/' -e 's/-c[^ ]* [^ ]* \|-[^ ]* //g'
结果看起来像:
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
Windows上列出所有进程的一种替代方法是:
WMIC path win32_process where "Caption='java.exe'" get ProcessId,Commandline
但这需要进行一些解析才能使其更清晰。
有很多方法可以做到这一点。您可以使用java.lang.ProcessBuilder
和“ pgrep”来获取进程ID(PID),例如:pgrep -fl java | awk {'print $1'}
。或者,如果您在Linux下运行,则可以查询/proc
目录。
我知道,这似乎很可怕,而且不可移植,甚至实施得不好,我同意。但是由于Java实际上是在VM中运行,出于某些荒谬的原因,我在JDK工作超过15年后才真正弄清了这一点,这就是为什么无法在JVM空间之外看到事物的原因,这对您来说真的很可笑考虑一下。你可以做一切,甚至fork
和join
子进程(这些是多任务处理时,世界上没有不知道的可怕的方式线程或并行线程,什么是地狱!这是怎么回事在与Java?:)。
我知道这将进行大量讨论,但是无论如何,我已经在我的项目中使用了一个非常好的API,它已经足够稳定(它是OSS,因此您仍然需要在真正信任该API之前对使用的每个版本进行压力测试):https ://github.com/jezhumble/javasysmon
JavaDoc:http : //jezhumble.github.io/javasysmon/,搜索该类com.jezhumble.javasysmon.OsProcess
,她将解决问题。希望它能对您有所帮助。
ps -eaf | grep [j]ava
这是更好,因为它只会显示你的活动进程不包括此命令也得到了java的字符串[]
的伎俩