2017-12-14 29 views
0

シェルスクリプトを初めて使用しているので、CPU使用率を監視するスクリプトを作成し、CPU使用率がしきい値に達すると、コマンドは、ここで私が悪い番号をエラー与え、また、ログファイルに任意の値を格納していない私のスクリプト、CPU使用率を自動的に監視し、しきい値に達すると結果を返す方法

while sleep 1;do if [ "$(top -n1 | grep -i ^cpu | awk '{print $2}')">>sy.log - ge "$Threshold" ]; then echo "$(top -n1)">>sys.log;fi;done 

答えて

0

であるあなたのスクリプトでは、シェルに新しいしている場合は特に、ファイルにインデントして保存する必要があります!

#!/bin/sh 

while sleep 1 
do 
    if [ "$(top -n1 | grep -i ^cpu | awk '{print $2}')">>sy.log - ge "$Threshold" ] 
then 
    echo "$(top -n1)" >> sys.log 
fi 
done 

あなたの状態はちょっと変わったようです。それはうまくいくかもしれませんが、それは本当に複雑に見えます。中間結果を変数に格納し、評価します。 "-ge"に構文エラーがすぐに表示されます。

セキュリティ上の理由から、ログファイルを絶対パスに格納する必要があります。変数を使用して読みを簡素化する。

#!/bin/sh 

LOGFILE=/absolute_path/sy.log 
WHOLEFILE=/absolute_path/sys.log 
Thresold=80 

while sleep 1 
do 
    TOP="$(top -n1)" 
    CPU="$(echo $TOP | grep -i ^cpu | awk '{print $2}')" 
    echo $CPU >> $LOGFILE 
    if [ "$CPU" -ge "$Threshold" ] ; then 
     echo "$TOP" >> $WHOLEFILE 
    fi 
done 
0

あなたにはいくつかのエラーがあります。

  • リダイレクトを使用してsy.logに出力を書き込むと、その出力はシェルで使用できなくなります。 teeでこれを回避できます。
  • -geの前のダッシュには、スペースを続けてはいけません。また

、いくつかの文体の発言:

  • grep x | awk '{y}'useless use of grepです。これは有用でより経済的に(そしてよりエレガントに)awk '/x/{y}'
  • echo "$(command)"useless use of echoであることができますが、これは取引のブレーカではありませんが、単にcommandが必要です。そのテキストを標準出力に出力できるように、標準出力に出力する内容をキャプチャする必要はありません。
  • とにかくtop -n 1の出力をキャプチャする場合は、実際に2回実行する必要はありません。

さらに注記:

  • あなたが抽出したいフィールドの総額を知っている場合は、多分あなたは大文字と小文字を区別せずに検索する必要はありません。 (topのバージョンでは、2番目のフィールドにロードされたCPUプレフィックスが表示されますが、これは本当に正しいですか?)
  • シェルは整数演算のみサポートしています。これはバグですか?おそらく、Awk(これは浮動小数点サポートを持っています)を使用して比較を実行したいでしょうか?これにより、ややトリッキーなリファクタリングも可能になります。比較が失敗した場合、Awk出力の終了コードを1にして、ifの条件として使用します。
#!/bin/sh 

while sleep 1 
do 
    if top=$(top -n 1 | 
     awk -v thres="$Threshold" '1; # print every line 
      tolower($1) ~ /^cpu/ { print $2 >>"sy.log"; 
       exitcode = ($2 >= thres ? 0 : 1) } 
      END { exit exitcode }') 
    then 
     echo "$top" >>sys.log 
    fi 
done 

は、あなたが本当にほぼ同じ名前の2つのログファイルを持つことを意味し、またはタイプミスということですか?ログにタイムスタンプを含めることは、トラブルシューティングとログファイルの実際の使用の両方に役立ちます。

関連する問題