CPUが80%未満の場合の命令実行

CPUが80%未満の場合の命令実行

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使用率チェックを繰り返すことはありません。

関連情報