CPU使用率が80%未満の場合は、10分ごとにコマンドを実行しようとします。私はbashスクリプトに慣れていません。総CPU使用率を取得する方法が見つかりました。 grep "CPU" | awk '{print $2 + $4}'' 次に、最大値の80%と比較したいと思います。ところで、なぜ2つを比較できないのか分かりません。スクリプトは次のとおりです。
#!/bin/bash
MAX=80
CPU=`top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'`
while true
do
if $CPU < $MAX
then
echo $CPU # This is an example
CPU=`top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'`
sleep 10m
fi
done
数値がコマンドとして解釈され、スクリプトが失敗します...()なぜコンパイルcannot open 80: No such file
できないのですか?この問題をどのように解決しますか?$MAX
$CPU
よろしくお願いします。
答え1
<
に使用されます
リダイレクト。整数を比較する必要がある場合:
if [ "$MAX" -gt "$CPU" ]
ただし、$CPU
浮動小数点数でもかまいません。 Bashは浮動小数点数に対して直接操作できないため、以下を使用する必要がありますbc
。
if [ "$(bc -l <<< "${CPU} > ${MAX}")" -eq 1 ]
$(..)
代わりにフォームを使用する必要があります。レガシーバックティックCPU
whileループ内では一度だけ割り当てることができます。
#!/bin/bash
MAX=80
while true
do
CPU="$(top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}')"
if [ "$(bc -l <<< "${CPU} > ${MAX}")" -eq 1 ]
then
echo "$CPU" # This is an example
sleep 10m
fi
done
答え2
top(1)
この問題を解決する最良の方法ではありません。これは、必要以上に多くをスキャンする非常に重い測定ツールです。また、瞬間的な値に焦点を当てますが、ここでは正しくありません。
代わりに、次を使用する必要があります。システム負荷平均カーネルで長期間連続して計算されているからです。これは、追加費用が発生しないため、測定に影響を与えず、通貨などの一時的な変更によって影響されないことを意味しますtop(1)
。
以下は、ロード平均に基づいて書き換えられたスクリプトです。
#!/bin/bash
HIGH_LOAD=6 # 80% of an 8-core system; see link above
while true
do
CURR_LOAD=$(cut -f2 -d' ' < /proc/loadavg)
if [ $CURR_LOAD -lt $HIGH_LOAD ]
then
run-background-command
fi
sleep 10m
done
呼び出しが条件外に移動されたことに注意してsleep
ください。とにかく呼び出しを遅らせたかった。負荷が低い場合と負荷が高い場合によって、待ち時間が異なるようにオーバーライドを追加することもif
できます。else
あなたのバージョンとは異なり、ループの内側と外側でCPU使用率チェックを繰り返すことはありません。