我怎样才能找出 java 当前正在运行哪些 jar 文件(以及它们的 PID)?

我怎样才能找出 java 当前正在运行哪些 jar 文件(以及它们的 PID)?

我有一个.jar因故障而臭名昭著的文件。当发生故障时,只有重新启动才能解决问题。我有一种方法可以检测故障(读取所述日志文件.jar)所以我想编写一个脚本,每当发生故障时都会终止该进程。问题是:

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

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

答案1

您可以运行该lsof命令,其中列出哪些进程已打开文件,并将您的 jar 文件作为参数。使用 less 查看文件的示例:

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

或者将它与几个 java 进程的 pid 一起使用:

 $ lsof -p 4438

答案2

使用ps ax会有帮助。

它将以 BSD 风格显示进程树,从而显示更多信息。

要找到您的特定流程,您只需搜索 JAR 名称即可。ps ax | grep JARNAME就可以了。

答案3

您可以在本机执行此操作,或者如果未通过 /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

答案4

你可以使用jps使用-l选项将返回使用完整路径的 .jar 文件。

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

相关内容