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

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

MyApp.jarたとえば、同じファイル名で実行される2つのJavaプロセスがあります。

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

これらの瓶は異なる場所に存在し、異なる構成を使用します。

プロセスを終了したいのですが、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

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

答え1

まず、なぜそれらの1つを殺すのですか?プロセスが多すぎるリソースを使用している場合は、次からPIDを取得できますtop

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

答え2

パラメータを変更するとアプリケーションに影響を与えるため、最善の方法ではありません。プログラム名自体である $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と追加情報(プロセスを区別するため)をログファイルに書き込むラッパースクリプトを使用してプロセスを開始します。

答え3

役に立つ唯一の方法は、より高いPID番号を決定することです。 PID番号が大きいほど後で実行されるプロセスです。しかし、常にそうではありません

関連情報