2016-07-17 4 views
3

Я играл с басром, и одна из вещей, которые я хочу видеть во все времена, - это использование моего процессора в процентах. Я решил установить эти данные в своем PS1. Проблема в том, что для точной оценки использования моего процессора мне нужно выполнять операции, требующие ожидания не менее 0,5 секунд.Как сделать работу функции в фоновом режиме в bash/заменить текст/использование ЦП

В результате этого моя новая командная строка отображается только в конце вычисления ЦП, через 0,5 секунды, что действительно неприемлемо. Чтобы справиться с этим, я подумал, что могу использовать поток для вычисления ЦП и показывать его только в конце, но я не знаю, как это сделать.

Одна из проблем заключается в том, что я отображаю другую информацию после процентного соотношения процессора, поэтому не знаю, можно ли даже задержать отображение ЦП, показывая остальную часть командной строки. Я подумал, что, может быть, я могу отобразить временную строку, такую ​​как ??.??, а затем заменить ее на реальное значение, но я не уверен, как это сделать, поскольку, если я быстро набираю команды, то позиция ??.?? может измениться (например, набрав ls 5 раз в строке очень быстро).

Возможно, есть еще более простое решение моей проблемы, например, вычисление процентного процента процессора другим способом?

Моего CPU функция процент расчетливой:

function cpuf(){ 
    NonIdle=0;Idle=0;Total=0;TotalD=0;Idled=0 
    NonIdle=$((`cat /proc/stat | awk '/^cpu/{print$2+$3+$4+$7+$8+$9}'` - $NonIdle)) 
    Idle=$((`cat /proc/stat | awk '/^cpu/{print$5+$6}'` - $Idle)) 
    sleep 0.5 
    NonIdle=$((`cat /proc/stat | awk '/^cpu/{print$2+$3+$4+$7+$8+$9}'` - $NonIdle)) 
    Idle=$((`cat /proc/stat | awk '/^cpu/{print$5+$6}'` - $Idle)) 
    Total=$((Idle+NonIdle)) 
    CPU=$(((Total-Idle)/Total)) 
    echo `echo "scale=2;($Total*100-$Idle*100)/$Total" | bc -l` 
} 

Как я называю это в Bashrc:

alias cpu="cpuf" 
PS1+="(\[${MAGENTA}\]CPU $(cpu)%" 
+5

Рассматривали ли вы хранить результат в файле, таких как '/ tmp/cpu.log', сохраните' cpuf' r unning как задание (вызывая 'cpuf &' перед созданием псевдонима) и изменяя 'alias cpu =" cat /tmp/cpu.log "'? – pah

+2

Почему вы используете 'cat'? 'awk' принимает имя файла в качестве параметра. Многочисленные дочерние процессы в вашей функции не будут сильно влиять на эффективность вашего процессора. – cdarke

+2

Threadp ваше решение кажется очень хорошей идеей, я проверю его по утрам и отправлю решение, если оно мне подходит, спасибо. cdarke, ты очень прав, я тоже это изменю. – PiggyGenius

ответ

2

Там нет необходимости изобретать колесо здесь, линукс уже заботится о захвате статистики системы в /proc/loadavg. Первое число - это средняя загрузка в последнюю минуту по всему процессору, поэтому нам просто нужно делить на число процессоров, которые мы можем определить, прочитав /proc/cpuinfo. Подвижной это в .bashrc мы получаем:

.bashrc

... 
# My fancy prompt, adjust as you like... 
FANCY_PROMPT="$GREEN\[email protected]\h:$PURPLE\w$BLUE$ $RESET" 

CPUS=$(grep -c bogomips /proc/cpuinfo) 

_prompt_command() { 
    LOAD_AVG_1_MIN=$(cut -d ' ' -f 1 /proc/loadavg) 
    PERCENT=$(echo "scale=0; $LOAD_AVG_1_MIN * 100/$CPUS" | bc -l) 
    PS1="CPU $PERCENT% $FANCY_PROMPT" 
    true 
} 

PROMPT_COMMAND="_prompt_command" 

In Use:

enter image description here

SO linux /proc/loadavg

+1

Это слишком страдает от [бесполезного использования 'cat'] (http://www.iki.fi/era/unix/award.html).'grep' отлично умеет читать'/proc/cpuinfo', хотя вы также можете избавиться от 'wc -l', заменив' grep -c'; и комбинация 'cut' и' bc' может быть более эффективной, если вы переработаете простой скрипт Awk. – tripleee

+0

Удален бесполезный кот. – xxfelixxx

+0

Я установил другой; Пожалуйста ознакомтесь. – tripleee