【发布时间】:2014-02-01 14:49:16
【问题描述】:
我有一个程序(服务器),我正在寻找一种方法(脚本),它将所有 stdout 重定向(或更好地复制)到文件并为每个条目添加时间戳。
我做了一些研究,我能得到的最大收获是感谢How to add timestamp to STDERR redirection。它重定向stdout,但添加的时间戳是脚本完成的时间:
#!/bin/bash
./server | ./predate.sh > log.txt
predate.sh的代码:
#!/bin/bash
while read line ; do
echo "$(date): ${line}"
done
似乎在程序退出后服务器输出被刷新。(没有重定向它工作正常)。此外,如果我尝试在提到的线程中的给定示例上使用predate.sh,它会完美运行。我知道向主程序添加时间戳很容易,但我宁愿避免编辑其代码。
【问题讨论】:
-
那么问题是所有的时间戳都是一样的,脚本完成的时间?听起来这是
server输出未正确缓冲的问题。 stackoverflow.com/questions/3465619/… 可能就是你要找的东西 -
管道输出到 awk。它提供了一个名为strftime的函数。
-
expect发行版附带一个名为unbuffer的程序:unbuffer ./server | ./predate.sh > log.txt -
另见 man stdbuf。
-
如果您在链接问题中尝试丹尼斯的解决方案,您会得到什么?例如
./server.sh > >( ./predate.sh > log.txt )