web-dev-qa-db-ja.com

CPU使用率が100%になったときに通知するシェルスクリプト

sar -u 1 | awk '{print $ 9}'

これにより、毎秒「CPUアイドル」値が得られます。この場合、メールを受け取りたいのですが、値が10回続けて「0」になりますか?

それを行うための適切な方法は何でしょうか?

予備的な解決策を見つけた

sar -u 1 | awk '{ if (int($9)==0) { 
                 i=i+1; {
                           print i, $9
                         }
                  }
       if (int($9)>=0) {
                  i=0
               }
               if (i>=10) print "sending email"
            }'

しかし、「送信メール」を印刷する最後の行では、このようにmuttを呼び出すことができません。

sar -u 1 | awk '{ if (int($9)==0) { 
                 i=i+1; {
                           print i, $9
                         }
                  }
       if (int($9)>=0) {
                  i=0
               }
               if (i>=10) mutt -s "VPNC Problem" [email protected] < /home/semenov/strace.output
            }'

問題は、muttコマンド呼び出しで「構文」エラーが表示されることです。何か案は?

4
DmitrySemenov

大丈夫正しいコマンドはこれです

sar -u 1 | awk '{ if (int($9)==0) { 
                 i=i+1; {
                           print i, $9
                         }
                  }
       if (int($9)>=0) {
                  i=0
               }
               if (i>=10) {
                      print "Sending email";
                      cmd="mutt -s  \"test\" [email protected] < /home/semenov/strace.output";
                      system(cmd)
               }
            }'
0
DmitrySemenov

それを行う適切な方法は、それを行わないことです。

CPU使用率(%usedまたは%idleのいずれか)は、監視するのに偽の値です。通常の動作中のさまざまな時点で100%になる可能性があります(SHOULD)。監視システムがCPU使用率をチェックすると同時に5〜10のWebリクエストを取得したため、本当に大量のアラートが必要ですか?私は答えがノーだと賭けています。

代わりに、Load Average(他のツールの中でuptimeによって報告される)を監視する必要があります。今すぐ実行(OSスケジューリング用語でのRunQの長さ)。
値は通常、1分間の負荷平均(「現在」)、5分間の負荷平均、および15分間の負荷平均の3つの値として報告されます。


1未満の負荷平均は、「アンロードされた」システムを示します(空きCPU時間が多く、プログラムの実行を待機していません)。
高い平均負荷(「高い」は、使用しているCPUの数と、負荷がかかった状態でのシステムのインタラクティブなパフォーマンスに関連しています)が問題の原因であり、調査する必要があります。

私は通常、負荷平均アラームのしきい値として10を使用します。この値は、通常は本番環境では表示されないはずですが、アラームが作動したら状況に対応する時間があるほど十分に低い値です。


どちらの場合でも監視するスクリプトは簡単です。

# [get your value and stuff it into $value
# Pick an appropriate threshold and stuff it into $threshold
if [ $value -gt $threshold ]; then  # (-gt or -lt as appropriate)
    echo "`hostname` needs attention!" | \
         mail -s "`hostname` monitoring alert" user@Host
fi

取得とスタッフィングの部分は、読者の演習として残します。
本当に実行したい場合は、調査する必要があります 一部の監視システム およびSNMP ...

2
voretaq7