如何防止管道命令的 I/O 缓冲

如何防止管道命令的 I/O 缓冲

以下命令链是

  1. 带日期戳的 ping (UNIX),

  2. 将 UNIX 日期戳转换为更易于人类阅读的格式,以及

  3. 输出到终端和日志文件。

ping -D localhost 2>&1 | sed 's/^\[\([0-9]*\.[0-9]*\)\]\(.*$\)/echo "[`date -d @\1 +"%Y-%m-%d %H:%M:%S"`] \2"/e' | tee -a ping.log

问题是,正如所写,输出似乎以几乎一分钟或约 50 行的块的形式进行缓冲,这与 ping 中通常的逐秒、逐行输出不同。

造成缓冲的原因是什么以及如何避免?

答案1

如果您的系统中可用,请使用解缓冲。应该很简单:

unbuffer ping -D localhost 2>&1 | unbuffer sed 's/^\[\([0-9]*\.[0-9]*\)\]\(.*$\)/echo "[`date -d @\1 +"%Y-%m-%d %H:%M:%S"`] \2"/e' | tee -a ping.log

相关内容