2015-08-31 7 views
10

В сценарии bash мне нужно подождать, пока загрузка процессора не станет ниже порога.Bash: подождите, пока загрузка процессора не станет ниже порога

Другими словами, я должен был бы команду wait_until_cpu_low, который я хотел бы использовать так:

# Trigger some background CPU-heavy command 
wait_until_cpu_low 40 
# Some other commands executed when CPU usage is below 40% 

Как я могу это сделать?

Edit:

  • целевой ОС: Red Hat Enterprise Linux Server версии 6.5
  • Я рассматриваю среднюю загрузку процессора (во всех ядер)
+0

Существует много сообщений, которые могут помочь получить текущее использование ЦП. Мой подход состоял бы в том, чтобы продолжать проверку использования через определенные промежутки времени, и если использование в пороге, находящемся ниже порога, будет проверять его и как только оно будет ниже порога, просто для продолжения остальной части кода. Я не кошелек bash. Пожалуйста, сообщите мне, если я пропустил что-то важное? https://unix.stackexchange.com/questions/152988/how-to-get-cpu-usage-for-every-core-with-a-bash-script-using-standard-nix-tools –

+2

Вы можете сузить этот вопрос до конкретной среды (например, Linux или Solaris), которая будет управлять конкретным инструментом для использования. Нет стандартного способа POSIX для загрузки процессора. Кроме того, вы должны уточнить, что вы подразумеваете под CPU: поскольку современный процессор имеет несколько ядер, считаете ли вы их каждый процессор? Вы хотите в среднем ядра? Вы хотите, чтобы средний показатель по всем ядрам процессоров? – bishop

+0

@bishop Спасибо за разъяснения. См. Мое редактирование. – fiddler

ответ

3
wait_for_cpu_usage() 
{ 
    current=$(mpstat 1 1 | awk '$12 ~ /[0-9.]+/ { print int(100 - $12 + 0.5) }') 
    while [[ "$current" -ge "$1" ]]; do 
     current=$(mpstat 1 1 | awk '$12 ~ /[0-9.]+/ { print int(100 - $12 + 0.5) }') 
     sleep 1 
    done 
} 

Обратите внимание, что для этого требуется пакет sysstat.

+2

'current' оценивается только один раз, правильно? Разве это не должно быть пересчитано внутри цикла? – fiddler

+0

На самом деле, текущий не оценивается только один раз, проблема в том, что я забыл обновить текущий статус, поэтому вы правы –

+0

'строка 4: [[: 6.67: синтаксическая ошибка: недействительный арифметический оператор (маркер ошибки равен« .67 ») ' – fiddler

3

Вы можете использовать функцию на основе утилиты top. Но учтите, что это не очень надежно, потому что загрузка процессора может - быстро - измениться в любое время. Это означает, что только потому, что проверка прошла успешно, не гарантируется, что загрузка процессора останется низкой, как только будет выполняться следующий код. Вы были предупреждены.

Функция:

function wait_for_cpu_usage { 
    threshold=$1 
    while true ; do 
     # Get the current CPU usage 
     usage=$(top -n1 | awk 'NR==3{print $2}' | tr ',' '.') 

     # Compared the current usage against the threshold 
     result=$(bc -l <<< "$usage <= $threshold") 
     [ $result == "1" ] && break 

     # Feel free to sleep less than a second. (with GNU sleep) 
     sleep 1 
    done 
    return 0 
} 

# Example call 
wait_for_cpu_usage 25 

Обратите внимание, что я использую bc -l для сравнения, так как отпечатки верхних загрузки процессора в качестве значения с плавающей точкой.

+0

Я получаю сообщение об ошибке. top -n1 | awk NR == 3 {print $ 2} ''возвращает' 6.2% us, ' – fiddler

+0

Какая версия top и awk вы используете? – hek2mgl

+0

наверх: 3.2.8, awk: 3.1.7 – fiddler

3

Более эффективная версия просто вызывает mpstat и awk один раз, и удерживает их обоих до тех пор, пока не закончится; нет необходимости явно sleep и перезапустить оба процесса каждую секунду (что, на встроенной платформе, может добавить до измеримой накладных расходов):

wait_until_cpu_low() { 
    awk -v target="$1" ' 
    $13 ~ /^[0-9.]+$/ { 
     current = 100 - $13 
     if(current <= target) { exit(0); } 
    }' < <(mpstat 1) 
} 

Я использую $13 здесь, потому что там idle % для моей версии mpstat ; замените соответствующим образом, если ваш отличается.

Это имеет дополнительное преимущество в правильной математике с плавающей запятой, а не в округлении до целых чисел для математической оболочки.

Смежные вопросы