无法将“top -b”输出写入文件

时间:2017-05-11 18:58:57

标签: linux awk

我想从top捕获输出以及时间戳,因此我执行此操作:

top -b | awk '/dockerd/ {print strftime("%Y-%m-%d-%H:%M:%S"), $0}'

这打印出以下内容:

2017-05-11-18:54:18  2569 root 20 0  624m  41m  28m S  0.0  4.2   0:07.32 dockerd
2017-05-11-18:54:21  2569 root 20 0  624m  41m  28m S  0.0  4.2   0:07.32 dockerd
2017-05-11-18:54:24  2569 root 20 0  624m  41m  28m S  0.0  4.2   0:07.32 dockerd

一切都很好,除非我尝试将输出重定向到这样的文件:

sudo top -b |
awk '/dockerd/ {print strftime("%Y-%m-%d-%H:%M:%S"), $0}' >> top.txt 2>&1

top.txt始终为空。为什么我不能将输出写入文件?

3 个答案:

答案 0 :(得分:1)

您可以尝试重定向一次迭代的输出,然后循环它,可能是这样的:

while :; do top -n 1 -b >> top.txt; sleep 1; done

答案 1 :(得分:1)

以下行似乎对我有用。

top -b | stdbuf -o 0 awk '/wget/ {print strftime("%Y-%m-%d-%H:%M:%S"), $0}' >> top.txt

问题是awk(在我的情况下为gawk)实际上是在缓冲输出(通过使用strace确认来确认)。所以stdbuf努力解除输出缓冲。但请注意,stdbuf不适用于所有命令(请参阅stdbuf(1) IE man stdbuf

答案 2 :(得分:0)

我相信它正在写入文件,但awk正在缓冲管道中的数据。我可以告诉你正在运行gawk,所以one of many solutions在这种情况下是添加system("")

top -b |
awk '/wget/ {print strftime("%Y-%m-%d-%H:%M:%S"), $0; system("")}' >top.txt 2>&1

如果您正在运行mawk,则可以向awk命令提供-Winteractive

更多general-purpose solution可能会导致stdbuf