如何找出Java当前正在运行的jar文件(及其PID)?


12

我有一个.jar因故障而臭名昭著的文件。发生故障时,仅重新启动会有所帮助。我有一种方法来检测故障(读取said的日志文件.jar),所以我想编写一个脚本,该脚本会在发生故障时终止该进程。问题是:

confus@confusion:~$ ps -A
...
4438 ?        00:00:00 java
4439 ?        00:00:00 java
4443 ?        00:00:00 java
...

所有正在运行的.jars 的进程名称自然是“ java”。我如何找出这些“ java”进程中哪个是我要杀死的进程,即正在运行的进程foobar.jar


请注意,如果以同一用户身份运行,则可以使用例如visualvm附加到该用户并在杀死它之前对其进行检查。
托尔比约恩Ravn的安徒生

Answers:


11

您可以运行该lsof命令,该命令列出哪些进程具有打开的文件,并以jar文件作为参数。使用更少的文件查看示例:

egil@mutter:~$ lsof foo.c
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
less    18871 egil    4r   REG    8,2        0 53862540 foo.c
egil@mutter:~$

要轻松地在脚本中重用pid,可以在简洁模式下运行它:

egil@mutter:~$ lsof -t foo.c
18871

这个答案更好。+1。
2011年

7

使用ps ax会有所帮助。

它将以BSD样式显示过程树,该树仅显示更多信息。

要找到您的特定过程,您只需grep JAR名称。ps ax | grep JARNAME会做的。


1

您可以执行本机操作,或者如果未通过/ proc // fd安装“ lsof”,则示例:

ps -ef|grep -w java
...
0c4       6917  6916  0 12:22 pts/7    00:00:00 java
...

ls -la /proc/6917/fd/
total 0
dr-x------ 2 0c4 svauser  0 Apr  2 12:23 .
dr-xr-xr-x 9 0c4 svauser  0 Apr  2 12:22 ..
lrwx------ 1 0c4 svauser 64 Apr  2 12:23 0 -> /dev/pts/7
lrwx------ 1 0c4 svauser 64 Apr  2 12:23 1 -> /dev/pts/7
lrwx------ 1 0c4 svauser 64 Apr  2 12:23 2 -> /dev/pts/7
lr-x------ 1 0c4 svauser 64 Apr  2 12:23 3 -> /opt/jdk1.8.0_191/jre/lib/rt.jar
lr-x------ 1 0c4 svauser 64 Apr  2 12:23 4 -> /media/veracrypt1/Downloads/rr/testone.jar
lr-x------ 1 0c4 svauser 64 Apr  2 12:23 5 -> /usr/share/java/gnu-getopt-1.0.14.jar

0

您可以将jps这些-l选项与返回完整路径的.jar文件一起使用。

-l显示应用程序主类的完整软件包名称或应用程序JAR文件的完整路径名称。


提出问题时,Java运行时中没有jps。今天有售。
托尔比约恩Ravn的安徒生

我可以在Java SE 6文档上看到它:docs.oracle.com/javase/6/docs/technotes/tools/share/jps.html,那是从2006年12月开始的,我可以在这里看到:en.wikipedia.org/ wiki / Java_version_history#Java_SE_7
froblesmartin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.