![我怎样才能找出 java 当前正在运行哪些 jar 文件(以及它们的 PID)?](https://linux22.com/image/1035270/%E6%88%91%E6%80%8E%E6%A0%B7%E6%89%8D%E8%83%BD%E6%89%BE%E5%87%BA%20java%20%E5%BD%93%E5%89%8D%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E5%93%AA%E4%BA%9B%20jar%20%E6%96%87%E4%BB%B6%EF%BC%88%E4%BB%A5%E5%8F%8A%E5%AE%83%E4%BB%AC%E7%9A%84%20PID%EF%BC%89%EF%BC%9F.png)
我有一个.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 文件。