CPU使用率が90%以上に達したときに通知を送信する

CPU使用率が90%以上に達したときに通知を送信する

CPU使用率が90%以上に達すると、Discord通知を送信しようとします。いくつか試しましたが、15行目でエラーが発生しました。これら2つの変数をどのように比較する必要がありますか"$CPU_USAGE" -ge "$MAX_CPU_USAGE"?他のすべてはうまくいきます。

これが私が受け取ったエラーです。

$ sudo bash -x /home/mp/cpu_usage.sh 

[sudo] password for mp: 
 + WEBHOOK_URL=<web-hook-url> 
 + MAX_CPU_USAGE=90 
 + true 
 + ++ top -bn2 
 + ++ grep %Cpu 
++ tail -1 
++ grep -P '(....|...) id,' 
++ awk '{print 100-$8}' 
 + CPU_USAGE=60.2 
 + '[' 60.2 -ge 90 ']' 
 + /home/mp/cpu_usage.sh: line 15: [: 60.2: integer expression expected
   + sleep 30

スクリプト -

#!/bin/bash

# Set the Discord webhook URL
WEBHOOK_URL="<web-hook-url>"

# Set the maximum CPU usage threshold (in percent)
MAX_CPU_USAGE=90

while true; do
  # Get the current CPU usage
  #CPU_USAGE=$(grep 'cpu' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}')
  CPU_USAGE=$(top -bn2 | grep '%Cpu' | tail -1 | grep -P '(....|...) id,'|awk '{print 100-$8}')

  # Check if the CPU usage is above the threshold
  if [ "$CPU_USAGE" -ge "$MAX_CPU_USAGE" ] ; then
    # Construct the message to send to Discord
    MESSAGE="CPU usage is HIGH"

    # Send the message to Discord using the webhook
    curl -H "Content-Type: application/json" -X POST -d "{\"content\":\"$MESSAGE\"}" $WEBHOOK_URL
  fi

  # Sleep for half a minute before checking again
  sleep 30
done

答え1

エラーメッセージ

 + /home/mp/cpu_usage.sh: line 15: [: 60.2: integer expression expected

コマンドで

 + '[' 60.2 -ge 90 ']' 

コードは浮動小数点値を比較しようとしますが、[シェルコマンドは整数値を期待していることを明確にしてください。シェルとは異なり、awk浮動小数点計算を実行できます。

問題を解決する 1 つの方法は、次の提案に従って浮動小数点値を整数値に変換することです。スティーブン・ハリス'回答

少ないプロセスが必要な方法でスクリプトを改善できます。比較とコマンドをスクリプトgrepに統合できます。tailawk

私はこのコマンドがgrep -P '(....|...) id,'役に立たないと思います。なぜなら前に空白が常に3~4文字につながるからだid,

MAX_CPU_USAGE=90

while true; do
  # Get the current CPU usage
  
  # Check if the CPU usage is above the threshold
  if top -bn2 | awk -v "max_cpu=$MAX_CPU_USAGE" '/^%Cpu/ { idle=$8 } END { if((100-idle)>max_cpu) exit 1 }'
  then
    # Construct the message to send to Discord
    MESSAGE="CPU usage is HIGH"

    # Send the message to Discord using the webhook
    curl -H "Content-Type: application/json" -X POST -d "{\"content\":\"$MESSAGE\"}" $WEBHOOK_URL
  fi

  # Sleep for half a minute before checking again
  sleep 30
done

コマンドの説明awk:

  • -v "max_cpu=$MAX_CPU_USAGE"=awkシェル変数を変数として渡します。
  • /^%Cpu/ { idle=$8 }= 8番目のフィールドを%Cpu一致する行の自由値として保存し、変数は最後のフィールドで終わります。
  • END { if((100-idle)>max_cpu) exit 1 }=入力終了時のリミットチェック。awk値が制限を超える場合はコード1で終了し、それ以外の場合は0で終了します。
  • パイプラインの最後のコマンドの終了コードを確認してくださいifawk

答え2

問題は、CPU_USAGE私のコンピュータの値が整数ではないということです。たとえば、ちょうど0.3その値を得ました。

この-geテストは整数のみを比較できます。

この問題を解決する簡単な方法は、数値が常に整数になるようにawk修正することです。print int(100-$8)

関連情報