Shell循环中turbostat后台运行致行首字符丢失问题求助
问题原因与解决办法
字符丢失的根本原因
turbostat 工具默认会从**标准输入(stdin)**读取控制命令(比如按Q退出)。当你在while循环中把turbostat后台运行(加&)时,它会和while循环共享同一个stdin(也就是testlist.txt的文件描述符)。turbostat启动后会从stdin读取字符,导致while循环下次读取时,行首的字符已经被turbostat“吃掉”——比如12行的第一个1被turbostat读走,while循环就只能读到剩下的2,这就是行首字符丢失的直接原因。
针对性解决办法
1. 解决循环读取字符丢失问题
将turbostat的stdin重定向到/dev/null,切断它和while循环的stdin共享,这样turbostat就不会去读取testlist.txt的内容了。修改脚本中的turbostat命令:
# 原命令 turbostat [你的监控参数] & # 修改后 turbostat [你的监控参数] < /dev/null &
这样while循环就能正常读取testlist.txt的每一行完整内容。
2. 获取turbostat每0.5秒的实时日志
直接调用doit.sh时只有平均结果,是因为turbostat默认会在监控进程结束后输出汇总平均数据。要实时输出每0.5秒的采样日志,需要添加采样间隔参数并指定输出模式:
- 使用
-i 0.5强制设置0.5秒的采样间隔 - 结合
-S参数显示实时统计数据(而非仅结束时的平均) - 如果不需要额外提示,可加
-q安静模式减少冗余输出
示例命令:
turbostat -i 0.5 -S -q [其他能耗监控参数] < /dev/null &
这样turbostat会每隔0.5秒输出一次当前的能耗数据,而不是只在最后输出平均结果。
3. 废弃yes|Q的临时方案
你之前用yes|Q让循环恢复正常,本质是用yes命令持续输出字符占用了turbostat的stdin,避免它读取testlist.txt。但这种方式会导致turbostat不断收到Q指令,可能提前退出或输出异常,完全没必要使用,直接用stdin重定向到/dev/null的方案即可。
内容的提问来源于stack exchange,提问作者edison
相关产品推荐
相关产品推荐

