.jar
ファイルがありますが、これは誤動作で有名です。誤動作が発生した場合、再起動のみが役立ちます。私はその誤動作を検出する方法を持っています(前述の.jar
のログファイルを読み取る)したがって、誤動作が発生するたびにプロセスを強制終了するスクリプトを作成したいと思います。問題は:
confus@confusion:~$ ps -A
...
4438 ? 00:00:00 Java
4439 ? 00:00:00 Java
4443 ? 00:00:00 Java
...
実行中のすべての.jar
sのプロセス名は、当然「Java」です。これらの「Java」プロセスのうち、私が殺したいもの、つまりfoobar.jar
を実行しているものを見つけるにはどうすればよいですか?
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
ps ax
を使用すると役立ちます。
プロセスツリーをBSDスタイルで表示し、より多くの情報を表示します。
特定のプロセスを見つけるには、JAR名をgrepするだけです。 ps ax | grep JARNAME
が行います。
これはネイティブで実行できます。または、「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