代码之家  ›  专栏  ›  技术社区  ›  domagaja

Linux—更快地读取或收集文件内容(例如,每秒的cpu温度)

  •  0
  • domagaja  · 技术社区  · 2 年前

    我正在开发一个运行ubuntu的系统。我正在读取/sys/class/thermal中提供的CPU频率和温度等基本数据。

    不幸的是,我有大约100个thermal\u区域需要从中读取数据。我使用:

    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秒。这太长了。 由于我想每秒钟收集一次数据,我的问题是,是否有一种方法可以更快地“读取”或“收集”数据?

    提前谢谢你

    1 回复  |  直到 2 年前
        1
  •  0
  •   Charles Duffy    2 年前

    在shell中编写代码时,您只能做这么多,但让我们从基础开始。

    • 命令替换, $(...) ,成本很高:它们需要创建FIFO, fork() 初始化一个新的子进程,将FIFO连接到该子进程的标准输出,读取FIFO并等待该子shell中运行的命令退出。
    • 外部命令,如 cat ,代价高昂:它们需要链接和加载单独的可执行文件;当你在没有 exec (在这种情况下,它们继承并使用shell的进程ID),它们 而且 需要新流程 fork() ed关闭。

    所有兼容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
    

    ...这样可以避免命令替换开销和 . 然而 阅读 一次只读取一个字节的内容;所以,虽然你没有支付管理费用,但它仍然相对缓慢。

    如果您从 /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) 不需要每次读取一个字节 阅读 做那只会更快 因为被痛击 虽然这并不意味着 快速的 . 现代生产监控系统通常采用 Go 或者使用类似JavaScript运行时的节点。