[英]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.