web-dev-qa-db-ja.com

どのjarファイルJavaが現在実行されているか(およびそれらのPID)を見つけるにはどうすればよいですか?

.jarファイルがありますが、これは誤動作で有名です。誤動作が発生した場合、再起動のみが役立ちます。私はその誤動作を検出する方法を持っています(前述の.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を実行しているものを見つけるにはどうすればよいですか?

11
con-f-use

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
10
Egil

ps axを使用すると役立ちます。

プロセスツリーをBSDスタイルで表示し、より多くの情報を表示します。

特定のプロセスを見つけるには、JAR名をgrepするだけです。 ps ax | grep JARNAMEが行います。

6

これはネイティブで実行できます。または、「lsof」が/ proc // fdを介してインストールされていない場合は、例:

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
0x0C4