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
に統合できます。tail
awk
私はこのコマンドが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で終了します。- パイプラインの最後のコマンドの終了コードを確認してください
if
。awk
答え2
問題は、CPU_USAGE
私のコンピュータの値が整数ではないということです。たとえば、ちょうど0.3
その値を得ました。
この-ge
テストは整数のみを比較できます。
この問題を解決する簡単な方法は、数値が常に整数になるようにawk
修正することです。print int(100-$8)