将 top 重定向到文件时,为什么该文件上的 cat 命令会显示多次 top 尝试的输出?

将 top 重定向到文件时,为什么该文件上的 cat 命令会显示多次 top 尝试的输出?

我正在定制一个内核为6.4.0的Linux系统,我注意到一个奇怪的问题。当我执行top > a.txt然后打开一个窗口执行时cat a.txt,我发现cat a.txt结果是多次尝试的结果top,但在其他Linux系统上不会出现这个问题。在其他Linux系统中,该cat命令仅显示一次命令结果top。我不知道为什么?

# top > a.txt
# cat a.txt
# ls /usr/bin/top -ltr
lrwxrwxrwx    1 1000     1000            17 Aug 23 02:34 /usr/bin/top -> ../../bin/busybox

添加top type

# type top
top is /usr/bin/top

答案1

某些top实现(例如在 OpenBSD 上,但也可能在某些 Linux 系统上)会检测其输出是发送到终端还是发送到非终端的内容(发送到管道或文件),并根据此更改其行为。如果输出到达终端,该实用程序将处于交互模式,接受用户的输入并定期更新其显示。当输出到其他地方时,则以top非交互模式运行,并且默认情况下仅输出一“屏幕”结果,然后退出。

Busybox 中包含的实现top不会执行此操作,即使输出进入文件或管道,也会继续输出屏幕更新。每次更新之前都会有一个清除屏幕的控制字符序列,因此cat应该显示最终的屏幕更新(除非终端不解释控制字符),而如果您在编辑器中打开文件或使用less查看其内容,您可能会看到几个连续的屏幕更新。Linux 系统上有时发现procps-ng的 变体似乎也是这种情况。top

如果您希望 Busyboxtop仅将单个屏幕的输出输出到文件,请使用

top -n 1 >file

至于为什么确实如此,这只是取决于各种top实现的开发人员以不同的方式实现了该工具。如果您想了解有关在 Busybox 中实施该实用程序时所采取的决策的更多信息top,您可能需要在 Busybox 特定的论坛或邮件列表中询问。

相关内容