输出重定向不适用于通过顶部管道传输到 grep

输出重定向不适用于通过顶部管道传输到 grep

当我在 Linux 中运行此命令时:

$ top -b -d 20 | grep "load average" -A 20 > top.log

top.log 始终为空。

但是当我运行这个命令时:

$ top -b -d 20 | grep "load average" -A 20 | tee top.log

然后top.log有内容。

如果我不想使用tee(因为我不想将输出显示到控制台上),如何更正第一个命令以便更新 top.log?

我的机器使用 CentOS Linux 7(核心)。

答案1

您应该使用--line-buffered选项grep(因为您的问题被标记为“centos”,所以您肯定使用的是 GNU grep)。

默认情况下,grep仅当输出为终端时才使用行缓冲(就像 stdio 函数:printf、puts 等)。该--line-buffered选项会覆盖这一点。 GNU coreutils 还有一个 stdbuf(1) 包装器,它应该与任何使用 stdio 的动态链接程序一起工作。

答案2

您可以cat /proc/loadavg间隔时间使用。为什么要从中拉出来top?它用于主动监控(大部分),并且总是比快速读取loadavg.对于进程列表,只需使用ps, 并使用—sort标志进行排序。例如

( while true ; do cat /proc/loadavg ; ps -aux | sort -nrk 3,3 | head -n 20 ; sleep 3 ; done ; ) | pipe ...

或者

( while true ; do cat /proc/loadavg ; ps -Ao user,uid,pid,comm,pcpu,tty —sort=-pcpu —no-headers | head -n 20 ; sleep 3 ; done ; ) | pipe ...

相关内容