同じファイル名を使用して実行される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
しかし、これは私には少し間違っているようです。より良い方法はありますか?
まず、 なぜそれらのいずれかを強制終了したいのですか? プロセスが使用しているリソースが多すぎる場合は、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
パラメータを変更するとアプリケーションに違いが生じるため、これは最善の方法ではありません。 $ 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と追加情報(プロセスを区別するため)をログファイルに書き込むラッパースクリプトを使用してプロセスを開始します。