改进 bash 脚本

改进 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

我可以得到一些关于获取平均 CPU 温度的专业提示吗?

答案1

使用“原始输出”模式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字段,添加温度并增加计数,然后在最后打印总数除以计数。

答案2

你可以做类似的事情

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

grep 将仅打印相关数字(空格确保仅打印实际温度,而不是临界温度或其他任何温度)并进行awk计算。NR是行数,因此如果核心数发生变化,它就会起作用。

答案3

您可以使用以下方法获取处理器的数量

grep -c ^processor /proc/cpuinfo

相关内容