2016-07-17 2 views
3

J'ai joué avec le bashrc et l'une des choses que je veux voir à tout moment est mon utilisation du processeur en pourcentage. J'ai décidé de mettre ces données dans ma PS1. Le problème est que pour avoir une estimation précise de l'utilisation de mon processeur, j'ai besoin de faire des opérations qui nécessitent une attente d'au moins 0,5 seconde. Par conséquent, ma nouvelle ligne de commande ne s'affiche qu'à la fin du calcul du processeur, 0,5 seconde plus tard, ce qui est vraiment inacceptable. Pour faire face à cela, j'ai pensé que je pourrais peut-être utiliser un thread pour faire le calcul du processeur et l'afficher uniquement à la fin, mais je ne sais pas comment le faire. L'un des problèmes est que j'affiche d'autres informations après le pourcentage de la CPU, donc je ne sais pas s'il est même possible de retarder l'affichage de la CPU tout en affichant le reste de la ligne de commande. Je pensais que je pourrais peut-être afficher une chaîne temporaire telle que ??.?? puis la remplacer par la valeur réelle mais je ne suis pas sûr de savoir comment le faire car si je tape rapidement les commandes du ??.?? peuvent changer (par exemple en tapant ls 5 fois d'affilée très vite).Comment faire fonctionner une fonction en arrière-plan dans bash/remplacer l'utilisation de texte/CPU

Peut-être y a-t-il une solution encore plus simple à mon problème tel que calculer le pourcentage de CPU d'une autre manière?

Mon pourcentage CPU fonction de calcul:

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` 
} 

Comment je l'appelle dans le bashrc:

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

Avez-vous envisagé stocker le résultat dans un fichier, comme '/ tmp/cpu.log', gardez le' cpuf' r unning comme un travail (en appelant 'cpuf &' avant de créer l'alias), et en changeant 'alias cpu =" cat /tmp/cpu.log "'? – pah

+2

Pourquoi utilisez-vous 'cat'? 'awk' prend un nom de fichier en tant que paramètre. Les processus enfants multiples dans votre fonction ne feront pas beaucoup pour l'efficacité de votre processeur. – cdarke

+2

Threadp votre solution semble être une très bonne idée, je vais vérifier dans la matinée et poster une solution si elle me va, merci. cdarke, tu as raison, je vais changer ça aussi. – PiggyGenius

Répondre

2

Il n'y a pas besoin de réinventer la roue, Linux prend déjà en charge la capture des statistiques du système en /proc/loadavg. Le premier nombre est la charge moyenne à la dernière minute sur tous les processeurs, donc nous avons juste besoin de diviser par le nombre de cpus, que nous pouvons déterminer en lisant /proc/cpuinfo. Rouler dans ce .bashrc nous obtenons:

.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" 

En cours d'utilisation:

enter image description here

SO linux /proc/loadavg

+1

Cela aussi souffre d'une [utilisation inutile de 'cat'] (http://www.iki.fi/era/unix/award.html).'grep' est parfaitement capable de lire'/proc/cpuinfo' lui-même, bien que vous puissiez aussi vous débarrasser de 'wc -l' en remplaçant' grep -c'; et les combos 'cut' et' bc' pourraient être plus efficaces si vous vous référez à un simple script Awk. – tripleee

+0

Chat inutile. – xxfelixxx

+0

J'ai réparé l'autre; S'il-vous-plaît évaluez. – tripleee