[英]Linux - read or collect file content faster (e.g. cpu temp every sec.)
我正在运行 ubuntu 的系统上工作。 我正在从 /sys/class/thermal 中提供的热区读取基本数据,例如 CPU 频率和温度。
不幸的是,我有大约 100 个 thermal_zones,我需要从中读取数据。 我这样做:
for SENSOR_NODE in /sys/class/thermal/thermal_zone*; do printf "%s: %s\n" $(cat ${SENSOR_NODE}/type) $(cat ${SENSOR_NODE}/temp); done
收集所有数据大约需要 2.5-3 秒。 这太长了。 因为我想每秒收集数据,所以我的问题是,是否有一种方法可以更快地“读取”或“收集”数据?
先感谢您
在 shell 中编写代码时,您只能做这么多,但让我们从基础开始。
$(...)
是昂贵的:它们需要创建一个 FIFO, fork()
一个新的子进程,将 FIFO 连接到该子进程的标准输出,从 FIFO 读取并等待在该子 shell 中运行的命令退出.cat
这样的外部命令是昂贵的:它们需要链接和加载一个单独的可执行文件; 当你在没有exec
的情况下运行它们时(在这种情况下它们继承并使用 shell 的进程 ID),它们还需要一个新进程来fork()
ed off。 所有 POSIX 兼容的 shell 都会为您提供read
命令:
for sensor_node in /sys/class/thermal/thermal_zone*; do
read -r sensor_type <"$sensor_node/type" || continue
read -r sensor_temp <"$sensor_node/temp" || continue
printf '%s: %s\n' "$sensor_type" "$sensor_temp"
done
...这可以让您避免命令替换开销和cat
的开销。 但是, read
一次只读取一个字节的内容; 因此,虽然您没有支付这笔开销,但它仍然相对较慢。
如果你从/bin/sh
切换到bash
,你会得到一个更快的选择:
for sensor_node in /sys/class/thermal/thermal_zone*; do
printf '%s: %s\n' "$(<"$sensor_node/type)" "$(<"$sensor_node/temp")"
done
...因为$(<file)
不需要像 read 那样进行一次一个字节的read
。 不过,这只会比bash更快; 这并不意味着它实际上很快。 现代生产监控系统通常使用Go或 JavaScript 运行时(如 Node.js)编写是有原因的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.