Linux终端:管道命令输出同时重定向至终端与文件问题排查
问题解决:tee无法写入MQTT命令输出到文件
你的问题出在管道命令的缓冲机制上:当命令输出不是直接指向终端时,很多工具(比如grep、xargs调用的sh)会启用全缓冲模式——只有当缓冲区填满(通常是几千字节)时才会输出内容,而终端环境下默认是行缓冲,所以你能实时看到输出,但tee接收不到内容,文件自然是空的。
之前加的unbuffer只处理了mosquitto_sub的输出,后续环节的缓冲问题没解决,所以没用。下面是两种可行的修复方案:
方案1:用stdbuf强制grep使用行缓冲
修改命令,在grep前添加stdbuf -oL,强制它每输出一行就立刻推送内容:
mosquitto_sub -h 192.168.1.5 -v -t ArgyleCourt/Property/# | xargs -d$'\n' -L1 sh -c 'date "%Y-%m-%d %T.%3N $0"' | stdbuf -oL grep "IrrigationTank\|BoreP\|Hub" | tee MQTT_TankfillMsgs.txt
如果需要同时捕获错误输出到文件,再加上2>&1:
(mosquitto_sub -h 192.168.1.5 -v -t ArgyleCourt/Property/# | xargs -d$'\n' -L1 sh -c 'date "%Y-%m-%d %T.%3N $0"' | stdbuf -oL grep "IrrigationTank\|BoreP\|Hub") 2>&1 | tee MQTT_TankfillMsgs.txt
方案2:用unbuffer包裹整个管道链
把整个处理逻辑放到unbuffer的子shell中,让所有环节都禁用缓冲:
unbuffer sh -c 'mosquitto_sub -h 192.168.1.5 -v -t ArgyleCourt/Property/# | xargs -d$'\n' -L1 sh -c '\''date "%Y-%m-%d %T.%3N $0"'\'' | grep "IrrigationTank\|BoreP\|Hub"' | tee MQTT_TankfillMsgs.txt
补充说明
你之前用()分组的操作本身没问题,但没必要——直接把管道链接tee即可。核心是要确保管道中每个生成输出的环节都用行缓冲,这样内容才能实时写入文件。
内容的提问来源于stack exchange,提问作者MaxG
相关产品推荐
相关产品推荐

