Obtenir une moyenne de chargement de cinq minutes en utilisant ksh avec disponibilité

Pour une idée de la charge moyenne du processeur, j’utilise la uptime dans un script ksh :

 uptime | awk '{print $11}' | sed '$s/.$//' | read CPU 

où j’utilise ensuite la variable CPU plus tard.

La partie à $11 sert à isoler les cinq dernières minutes . Mais, j’ai remarqué aujourd’hui que cela ne fonctionnait pas. Plus précisément, la partie des cinq dernières minutes a été retournée avec $9 . La fonction renvoie moins de parameters. Cela est dû au fait que la machine a été récemment redémarrée et que le uptime affiche le nombre de minutes écastings depuis le redémarrage au lieu des jours et des minutes.

Y a-t-il un moyen de ne recevoir que les cinq dernières minutes du temps de disponibilité?

Essayez de séparer le texte avant “Load Average”, puis utilisez awk sur la partie restante.

 uptime | sed 's/.*load average: //' | awk -F\, '{print $2}' 
 cut -d ' ' -f2 /proc/loadavg 

/ proc / loadvg est la source de données pour la disponibilité, w, qui et d’autres. Il a un format plus simple et les nombres ont toujours un point avant la partie décimale (la disponibilité et les parameters régionaux actuels, vous pouvez donc trouver quelque chose comme

charge moyenne: 0,18, 0,26, 0,30

qui sont plus difficiles à parsingr

de plus, le facteur est incroyablement bas! 😉

Il serait peut-être plus simple de lire le deuxième au dernier champ plutôt que le 9 ou le 11:

 uptime | awk '{print $(NF-1)}' FS=, 

Cette petite fonction shell devrait fonctionner avec bash ou ksh (93)

  function loadavg { typeset minutes=$1 t1=$(uptime) echo ${t1#*load average: } | ( IFS=', ' && read L1 L5 L15 case $minutes in (1) echo $L1;; (5) echo $L5;; (15) echo $L15;; ("") echo $L1 $L5 $L15;; (*) echo "usage: loadavg [ 1 | 5 | 15 ]" 1>& 2 esac ) } 

Explication:

Ce code utilise IFS pour diviser la chaîne après “load average:” en trois champs. ‘typeetet’ et le sous-shell isolent les variables de fonction des autres variables du shell.

Ce qui suit simplifie le résultat et renvoie simplement la réponse à la question d’origine:

 function load5 { typeset t1=$(uptime) echo ${t1#*load average: } | ( IFS=', ' && read L1 L5 L15 echo $L5 ) } 

Cela pourrait vous donner le meilleur résultat que je l’utilise pour obtenir ma moyenne de charge toutes les 5 minutes:

$ uptime | awk ‘{print $ 11}’ | tr -d ‘,’

Donc, j’avais du mal à en écrire un qui fonctionnait à la fois sous Linux et Mac OS X. Après beaucoup de combats, je suis arrivé à ceci:

 uptime | sed 's/.*load average[s]*://' | awk '{print $3}' 

J’espère que cela est utile pour quelqu’un.