すべてコンパイル/パッケージ化し<name-of-the-app>.jar
てサーバー上で実行する小さなJavaアプリのスイートがあります。時折、そのうちの 1 つが例外をスローし、窒息して死ぬことがあります。これらの実行可能な JAR がすべてまだ実行されているかどうかを定期的にポーリングし、実行されていないものがある場合は、電子メールを送ってどれが死んでいるかを通知する、簡単で汚い Perl スクリプトを作成しようとしています。
これを手動で判断するには、ps -aef | grep <name-of-app>
確認するアプリごとに を実行する必要があります。たとえば、myapp.jar
がプロセスとして実行されているかどうかを確認するには、 を実行しps -aef | grep myapp
、 を表す JVM プロセスを説明する grep の結果を探しますmyapp.jar
。この手動チェックは今や退屈になりつつあり、自動化の最有力候補です!
プロセスが実行されているかどうかを確認するコードを実装しようとしています。これを、実行可能 JAR の名前を受け入れてorsub
を返すa にしたいと思います。true
false
sub isAppStillRunning($appName) {
# Somehow run "ps -aef | grep $appName"
# Somehow count the number of processes returned by the grep
# Since grep always returns itself, determine if (count - 1) == 1.
# If so, return true, otherwise, false.
}
sub
アプリの名前を渡し、通常のコマンドを実行し、 によって返される結果の数をカウントできる必要がありgrep
ます。a を実行するとgrep
常に少なくとも 1 つの結果 (grep
コマンド自体) が返されるため、(結果の数 - 1) が 1 に等しい場合にアプリが実行中であることを示すロジックが必要です。
私は Perl を初めて使用するので、このロジックを実装する方法を理解するのに苦労しています。これまでの私の最善の試みは次のとおりです。
sub isAppStillRunning($appName) {
# Somehow run "ps -aef | grep $appName"
@grepResults = `ps -aef | grep $appName`;
# Somehow count the number of processes returned by the grep
$grepResultCount = length(@grepResults);
# Since grep always returns itself, determine if (count - 1) == 1.
# If so, return true, otherwise, false.
if(($grepResultCount - 1) == 1)
true
else
false
}
次に、同じ Perl スクリプト内からメソッドを呼び出すには、次のように実行します。
&isAppStillRunning("myapp");
サブを定義し、適切なアプリ名でそれを呼び出すためのヘルプは大歓迎です。前もって感謝します!