![输出重定向不适用于通过顶部管道传输到 grep](https://linux22.com/image/150790/%E8%BE%93%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91%E4%B8%8D%E9%80%82%E7%94%A8%E4%BA%8E%E9%80%9A%E8%BF%87%E9%A1%B6%E9%83%A8%E7%AE%A1%E9%81%93%E4%BC%A0%E8%BE%93%E5%88%B0%20grep.png)
当我在 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 ...