継続的に実行される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 Version
1.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
が、他の方法を使用すると問題が発生します。