Javaプロセスが実行されているかどうかを検出するための完全な方法

Javaプロセスが実行されているかどうかを検出するための完全な方法

継続的に実行されるJavaプロセスがありますが、まだ完全にデバッグしていない理由で競合が発生することがあります。したがって、5分ごとにプロセスを検索するcronジョブもあり、プロセスが実行されていないことが確認されたら、スクリプトを呼び出して再起動します。

問題は、時にはスキャンスクリプトが時々偽の肯定を得ることです。実際には、プロセスが実行されていてもプロセスが実行されていないと思います。私はこれを行うときに一貫性を見ませんでした。しかし、プロセスが実行されているかどうかを確認する完全に確実な方法が必要です。

私が現在やっていることはこんな感じです。

if ! pgrep -f '/path/to/XML2DB.jar -n' > /dev/null
then
    nice -n 19 java -Xmx2024M -jar /path/to/XML2DB.jar -n > /dev/null 2>/dev/null &
    echo "" | mail -s "$HOST: xml2db was found not running, is being started" [email protected]
fi

pgrep以前はこれを使用していましたが、! ps ax | grep -v grep | grep "XML2DB.jar -n" > /dev/nullこれも偽の肯定を生成しました。

Scientific Linux SL release 3.0.9 (SL)現在のLinuxバージョンはLSB Version1.3です。

よろしくお願いします!

ベストアンサー1

この技術にはps ax | grep -v grep | grep "XML2DB.jar -n"競争条件があります。grepインスタンスが時間内に開始または開始されない可能性があるpsため、不正確な数が得られます。ここそしてここ。あなたはそれを使用するのが難しい最初の人ではありません。

何が起こっているかをstrace pgrep somepattern確認するために、RHELボックスでテストを実行しました。pgrepこれはディレクトリ内のすべてのプロセス数を数え、/procいくつ/proc/<PID>/cmdlineかのPIDを開き、内容を読み込みます。おそらく、コマンドpgrepラインで提供されているパターンと一致します。私はここで手を振っていますが、そこにも競争条件があると確信しています。

これに対する唯一の確実な解決策は、Javaプロセスが」ディレクトリロックディレクトリの作成はユーザープロセスに対してアトミックです。ディレクトリロック、ロックされたディレクトリのファイルにPIDを書き込む必要があります。

ファイルのPIDを使用して、Javaプログラムが実行されていることを確認できますkill -0 $(cat /whatever/lockdir/PIDfile)。プロセスが存在しない場合は、killゼロ以外の状態で終了します。

秘密は、コマンドラインからPIDをJavaプログラムに渡すことです。

exec java blah blah -mypid $$

PIDファイルを作成、解釈、削除し、ディレクトリをロックしてもエラーや例外には非常に注意が必要ですkill -0が、他の方法を使用すると問題が発生します。

おすすめ記事