将hd-idle运行输出重定向至自定义Bash脚本失败求助
问题排查与解决
1. hd-idle默认静默运行,需开启调试输出
hd-idle默认不会主动打印磁盘升降速的操作日志,必须添加-d参数才能让它输出相关信息到控制台流。你单独测试脚本正常,但重定向时没给hd-idle加该参数,导致没有输出产生,脚本自然收不到内容。
执行命令时要改成:
hd-idle -d |& ./你的脚本.sh
2. 管道输出的缓冲问题
多数命令在通过管道输出时会使用全缓冲(仅针对终端时才默认行缓冲),导致输出不会实时传递给脚本,而是攒够一定字节数才发送。可以用工具强制调整为行缓冲:
用stdbuf设置行缓冲:
stdbuf -oL hd-idle -d |& ./你的脚本.sh
-oL参数将标准输出设为行缓冲,确保每一行输出都立刻传递给脚本。
如果系统没有stdbuf,也可以用unbuffer(需安装expect包):
unbuffer hd-idle -d |& ./你的脚本.sh
3. 脚本输入读取逻辑问题
如果你的脚本用read读取输入但处理不当,试试改用更可靠的循环读取方式,同时实现日志写入+控制台输出:
#!/bin/bash LOG_FILE="/var/log/hd-idle-custom.log" # 循环读取每一行输入,保留空格与特殊字符 while IFS= read -r line; do # 生成时间戳 timestamp=$(date "+%Y-%m-%d %H:%M:%S") # 替换sdX为磁盘型号/序列号(替换逻辑根据你的需求调整,比如用lsblk/smartctl获取对应信息) modified_line=$(echo "$line" | sed -E 's/sd([a-z])/$(你的磁盘信息查询命令 sd\1)/g') # 同时写入日志并输出到控制台 echo "[$timestamp] $modified_line" | tee -a "$LOG_FILE" done
IFS= read -r line能避免截断含空格或特殊字符的行,tee -a则解决了日志写入与控制台输出同时生效的问题。
4. 确认hd-idle的输出流向
部分版本的hd-idle会把调试日志输出到stderr而非stdout,不过|&是Bash专属语法,等同于2>&1 |,会同时重定向stdout和stderr。你可以单独测试hd-idle的输出:
hd-idle -d 2>&1 | head -5
如果能看到内容,说明流向正常;如果看不到,可能是hd-idle版本或参数配置问题。
内容的提问来源于stack exchange,提问作者merlin
相关产品推荐
相关产品推荐

