Улучшить скрипт bash

У меня есть четырехъядерный рабочий стол, и я хотел узнать среднюю температуру по датчикам. так что я написал этот лайнер bash 1.

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

но это не идеально, я уверен. например, если количество ядер изменится, мой скрипт сломается или просто будет не таким точным. Как я мог бы написать скрипт, который смотрит на количество или выходные значения и корректирует количество ядер?

как в (псевдокод вперед):

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

Я надеюсь, что это читается человеком. Вывод первой части выглядит примерно так:

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

Могу ли я получить некоторые советы по получению средней температуры процессора?

3 ответа

Решение

Вы могли бы сделать что-то вроде

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

Grep будет печатать только соответствующие цифры (пробелы гарантируют, что будет напечатана только фактическая температура, а не критическая или что-либо еще) и awk делает расчет. NR количество строк, которое будет работать, если количество ядер изменится.

Используя режим "необработанного вывода" sensors для более простого написания сценариев:

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

Например:

$ 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

Вооружившись такими красиво помеченными полями, можно создать гораздо более простую команду awk:

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

По сути, для каждого temp.*_input В поле добавьте температуру и увеличьте счетчик, затем в конце выведите сумму, деленную на счетчик.

Вы можете получить количество процессоров, использующих

grep -c ^processor /proc/cpuinfo
Другие вопросы по тегам