Вывод прогресс-бара с информацией о нагрузке на CPU

Искусство написания bash скриптов. Делимся своими наработками
Ответить
Аватара пользователя
ZEN
Администратор
Сообщения: 1353
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

Вывод прогресс-бара с информацией о нагрузке на CPU

Сообщение ZEN » 07 дек 2012, 00:55

В прошлой теме я опубликовал код, который строит прогресс-бар в терминале. А сейчас я публикую код, ради которого началась вся затея - нарисовать прогресс-бар в терминале с нагрузкой на CPU. Сразу скажу, что оригинальную функцию получения нагрузки на CPU я взял из скрипта на Githab -e и немного модифицировал, так как с первого раза функция выдавала не точное число.

Выглядит результат работы скрипта как и прежде:

Код: Выделить всё

zen@debian:~$ ./cpu_load.sh 
[#=================================================] 3%
zen@debian:~$ ./cpu_load.sh 
[##================================================] 4%
zen@debian:~$ ./cpu_load.sh 
[==================================================] 1%
А вот код немного расширился:

Код: Выделить всё

#!/bin/bash
############################################################
# Linux CPU Usage
# 
# Fork: Poltavchenko Dmitriy (http://xinit.org.ua)
# Author: Moises P. Sena (http://moisespsena.com)
# Original Author: Paul Colby (http://colby.id.au)
#
# no rights reserved :)
############################################################

PREV_TOTAL=0
PREV_IDLE=0

cpu_load() {
    local CPU=(`cat /proc/stat | grep '^cpu '`) # Get the total CPU statistics.
    unset CPU[0] # Discard the "cpu" prefix.
    local IDLE=${CPU[4]} # Get the idle CPU time.

    # Calculate the total CPU time.
    local TOTAL=0
    for VALUE in "${CPU[@]}"; do
        let "TOTAL=$TOTAL+$VALUE"
    done

    unset CPU
    sleep .5

    local CPU=(`cat /proc/stat | grep '^cpu '`) # Get the total CPU statistics.
    unset CPU[0] # Discard the "cpu" prefix.
    local PREV_IDLE=${CPU[4]} # Get the idle CPU time.

    # Calculate the total CPU time.
    local PREV_TOTAL=0
    for VALUE in "${CPU[@]}"; do
        let "PREV_TOTAL=$PREV_TOTAL+$VALUE"
    done

    # Calculate the CPU usage since we last checked.
    let "DIFF_IDLE=$IDLE-$PREV_IDLE"
    let "DIFF_TOTAL=$TOTAL-$PREV_TOTAL"
    let "DIFF_USAGE=(1000*($DIFF_TOTAL-$DIFF_IDLE)/$DIFF_TOTAL+5)/10"

    echo "$DIFF_USAGE"
}

VALUE=$(cpu_load)
POS=0
MAX=50
CUR=`echo "scale=1; $MAX/100*$VALUE" | bc | awk -F. '{print $1}'`

echo -n "["

while
let POS+=1
[[ $POS -lt $MAX ]]
do
    if [[ $POS -lt $CUR ]]
    then
        echo -n "#"
    else
        echo -n "="
    fi
done

echo "] $VALUE%"

exit 0;
 
Прошлая версия:

Код: Выделить всё

#!/bin/bash
############################################################
# Linux CPU Usage
#
# Fork: Poltavchenko Dmitriy (http://xinit.org.ua)
# Author: Moises P. Sena (http://moisespsena.com)
# Original Author: Paul Colby (http://colby.id.au)
#
# no rights reserved :)
############################################################

PREV_TOTAL=0
PREV_IDLE=0

cpu_load() {
    for i in {1..2}
    do
    local CPU=(`cat /proc/stat | grep '^cpu '`) # Get the total CPU statistics.
    unset CPU[0] # Discard the "cpu" prefix.
    local IDLE=${CPU[4]} # Get the idle CPU time.

    # Calculate the total CPU time.
    local TOTAL=0
    for VALUE in "${CPU[@]}"; do
        let "TOTAL=$TOTAL+$VALUE"
    done

    # Calculate the CPU usage since we last checked.
    let "DIFF_IDLE=$IDLE-$PREV_IDLE"
    let "DIFF_TOTAL=$TOTAL-$PREV_TOTAL"
    let "DIFF_USAGE=(1000*($DIFF_TOTAL-$DIFF_IDLE)/$DIFF_TOTAL+5)/10"

    # Remember the total and idle CPU times for the next check.
    PREV_TOTAL="$TOTAL"
    PREV_IDLE="$IDLE"
    sleep .5
    done

    echo "$DIFF_USAGE"
}

VALUE=$(cpu_load)
POS=0
MAX=50
CUR=`echo "scale=1; $MAX/100*$VALUE" | bc | awk -F. '{print $1}'`

echo -n "["

while 
let POS+=1
[[ $POS -lt $MAX ]]
do
    if [[ $POS -lt $CUR ]]
    then
        echo -n "#"
    else
        echo -n "="
    fi
done

echo "] $VALUE%"

exit 0;
 
Если необходимо следить за нагрузкой, то можно воспользоваться утилитой watch, по-умолчанию утилита перезапускает скрипт каждые 2 секунды
/bin/bash писал(а):watch ./cpu_load.sh
Но я уверен вы с параметрами справитесь, если потребуется другое время обновления
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
priemhik
Сообщения: 61
Зарегистрирован: 07 ноя 2012, 13:15
Темы: 7
Откуда: 31 регион RUS
Статус: Не в сети

Re: Вывод прогресс-бара с информацией о нагрузке на CPU

Сообщение priemhik » 07 дек 2012, 07:15

А как бы сделать , чтобы на многоядерном проц показывалась инфа на каждое ядро :?

Аватара пользователя
ZEN
Администратор
Сообщения: 1353
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

Re: Вывод прогресс-бара с информацией о нагрузке на CPU

Сообщение ZEN » 07 дек 2012, 10:31

Это надо не слабо повозиться с функцией в скрипте.... Или использовать утилиту mpstat из пакета sysstat, которая выдает информацию по нагрузке на каждое ядро. Позже переделаю скрипт на его основе. А ценность данного скрипта как раз в том, что не требует установки других утилит.
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
lumberjack
Модератор
Сообщения: 1009
Зарегистрирован: 30 сен 2012, 04:04
Темы: 152
Откуда: Сургут
Статус: Не в сети

Re: Вывод прогресс-бара с информацией о нагрузке на CPU

Сообщение lumberjack » 07 дек 2012, 11:45

priemhik писал(а):А как бы сделать , чтобы на многоядерном проц показывалась инфа на каждое ядро :?
cat /proc/stat | grep cpu
все, что будет после первой строки -- загрузка ядер

Аватара пользователя
ZEN
Администратор
Сообщения: 1353
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

Re: Вывод прогресс-бара с информацией о нагрузке на CPU

Сообщение ZEN » 16 дек 2012, 22:46

Обновил функцию нагрузки на CPU. Исходный код в первом посте.
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей