web-dev-qa-db-ja.com

同じ名前のJavaプロセスを一意に識別する

同じファイル名を使用して実行される2つのJavaプロセス、MyApp.jar (例えば)。

/usr/Java/latest/bin/Java -jar MyApp.jar

これらのjarファイルはさまざまな場所に存在し、さまざまな構成を使用します。

1つのプロセスを強制終了できるようにしたいのですが、2つを区別する方法がわかりません。私は実行します:

 ps aux | grep [M]yApp.jar

そして取得:

admin    21509  0.8  0.1 1199908 20484 ?       Sl   08:21   0:00 /usr/Java/latest/bin/Java -jar MyApp.jar
admin    21585  6.7  0.1 1199764 20084 ?       Sl   08:21   0:00 

それらを区別できるように、いくつかのダミーパラメータを使用してプロセスを作成することを考えました。

/usr/Java/latest/bin/Java -jar MyApp.jar MyAppTheFirst

そして

/usr/Java/latest/bin/Java -jar MyApp.jar MyAppTheSecond

しかし、これは私には少し間違っているようです。より良い方法はありますか?

4
Peter Wood

まず、 なぜそれらのいずれかを強制終了したいのですか? プロセスが使用しているリソースが多すぎる場合は、topでPIDを取得できます。

top -n 1

定期的に再起動する必要がある場合、または外部の刺激に反応する必要がある場合は、 プロセス管理 を使用します。

while true
do
    Java -jar MyApp.jar &
    my_app_pid=$!
    while ! whatever_makes_me_think_my_app_should_be_restarted
    do
        sleep 60
    done
    kill $my_app_pid
done
3
l0b0

パラメータを変更するとアプリケーションに違いが生じるため、これは最善の方法ではありません。 $ 0、つまりプログラム名自体を変更できます。ほとんどのプログラムはそれを気にしませんが、それに基づいて動作を変更するものもあります(たとえば、mtoolsやbusyboxを使用してIIRCのように異なる名前で同じバイナリを呼び出すことができる場合):

bash -c 'exec -a mysleep sleep 100'
ps aux | grep sleep
hl       20818  0.0  0.0   5732   576 pts/10   S+   10:01   0:00 mysleep 100

または、環境を使用します。

bash -c 'IDSTRING=PROC1 exec sleep 100'
PID=20936
tr '\0' '\n' </proc/"$PID"/environ | grep IDSTRING
IDSTRING=PROC1

または、PIDと追加情報(プロセスを区別するため)をログファイルに書き込むラッパースクリプトを使用してプロセスを開始します。

2
Hauke Laging