You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:45:32