melhora o script bash

4

Eu tenho um desktop quad core, e eu queria saber a temperatura média de acordo com os sensores. então eu escrevi este bash 1 liner.

echo 'sensors -A | awk {'print '} | sed 's/+\|(crit\|0:\|°C//g'' |  awk '{print ( +  +  + )/4}'

mas não é perfeito, tenho certeza. Por exemplo, se o número de núcleos mudar, meu script será quebrado ou simplesmente não será tão preciso. Como posso escrever um script que analise os valores numéricos ou de saída e ajuste o número de núcleos?

como em (pseudo código à frente):

echo 'sensors -A | awk {'print '} | sed 's/+\|(crit\|0:\|°C//g'' |  awk '{print ($n + $n+1 <=($number of cores)) )/($number of cores)}'

Espero que seja legível para humanos. A saída da primeira parte é algo como:

$  echo 'sensors -A | awk {'print '} | sed 's/+\|(crit\|0:\|°C//g''
31.0 31.0 26.0 27.0

posso obter algumas dicas sobre como obter a temperatura média da CPU?

    
por j0h 09.04.2015 / 18:35

3 respostas

3

Você poderia fazer algo como

sensors -A | grep -oP '^Core.+?  \+\K\d+' | awk '{k+=}END{print k/NR}'

O grep imprimirá apenas os números relevantes (os espaços garantem que apenas a temperatura real seja impressa, não a crítica ou qualquer outra coisa) e o awk faz o cálculo. NR é o número de linhas para que funcione se o número de núcleos mudar.

    
por terdon 09.04.2015 / 19:21
7

Usando o modo "saída bruta" de sensors para facilitar a criação de scripts:

-u    Raw output. This mode is suitable for debugging  and  for  post-
      processing  of  the  output  by  scripts. It is also useful when
      writing a configuration file because  it  shows  the  raw  input
      names which must be referenced in the configuration file.

Por exemplo:

$ sensors -Au
coretemp-isa-0000
Physical id 0:
  temp1_input: 63.000
  temp1_max: 85.000
  temp1_crit: 105.000
  temp1_crit_alarm: 0.000
Core 0:
  temp2_input: 51.000
  temp2_max: 85.000
  temp2_crit: 105.000
  temp2_crit_alarm: 0.000

Armado com campos tão bem rotulados, pode-se construir um comando awk muito mais simples:

sensors -Au | awk '/temp.*_input/{temp += ; count += 1} END {print temp/count}'

Essencialmente, para cada campo temp.*_input , adicione a temperatura e incremente uma contagem e, no final, imprima o total dividido pela contagem.

    
por muru 09.04.2015 / 18:53
1

Você pode obter o número de processadores usando

grep -c ^processor /proc/cpuinfo
    
por tusharkant15 09.04.2015 / 18:40