
同じ Linux サーバー上で複数のほぼ同一の Java プロセスを実行する最適な方法は何ですか?
環境の説明:
計算グリッドを提供する Java プロセスのセットを実行しています。プロセス間の唯一の違いは、ノード名を識別するコマンド ライン パラメータです。次のようになります。
(プロセス1) Java -DNodeNumber=1 CalculationNode
(プロセス2) Java -DNodeNumber=2 CalculationNode
(プロセス3) Java -DNodeNumber=3 CalculationNode
(プロセス4) Java -DNodeNumber=4 CalculationNode
各プロセスを起動するスクリプトは比較的単純ですが、約15個の他のパラメータが必要なため簡単ではありません。これらはすべてのプロセスで同一です。
同じ NodeNumber パラメータでプロセスが失敗した場合は、そのプロセスを再起動できる必要があります。つまり、ノード 3 に障害が発生した場合は、ノード 3 として再起動する必要があります。
答え1
プロセスが失敗した場合は、それ以上失敗しないように修正する必要があると私は主張します。
期待どおりの動作をするには、次のようなもので十分です (テストされていないため、自己責任で使用してください)。
#!/bin/bash
for i in $(seq 1 4)
do
(
echo "Starting node $i..."
while ! java -DNodeNumber=$i CalculationNode
do
sleep 1
echo "Restarting node $i..."
done
) &
done
wait
ループを中断するには、各プロセスが終了コード 0 で終了する必要があります。それ以外の場合は、スクリプトによって再起動されます。
答え2
Juliano の解決策は単純なケースでは機能するかもしれませんが、あらゆる状況に対応できるわけではありません。たとえば、エラー処理コードにエラーがある場合、エラーが発生しても、プロセスの 1 つが終了ステータス 0 で終了する可能性があります。または、デッドロックが発生したり、何も実行せずに他の種類の無限ループに陥ったりする可能性があります。
もっと凝った解決策が欲しいなら、ナギオス特別な監視タスク用のプラグインを作成できます。
答え3
いつでも使えるデーモンツールプロセスを監視および再起動します。