【问题标题】:How to capture the output of a top command in a file in linux?如何在linux的文件中捕获top命令的输出?
【发布时间】:2012-07-28 14:33:00
【问题描述】:

我想将特定“top”命令的输出写入文件。我做了一些谷歌搜索,发现可以使用以下命令来完成。

top -n 10 -b > top-output.txt

其中-n 指定迭代次数,-b 用于批处理模式。如果让 top 进行 10 次迭代,这将非常有效。但是如果我用 Ctrl-C 中断命令的运行,输出文件似乎是空的。

我不会事先知道迭代次数,所以我需要手动打破它。如何在不指定迭代的情况下捕获文件中 top 的输出?

我要准确使用的命令是

top -b | grep init > top-output.txt

只要我想就可以打破它。但它不起作用。

编辑:为了给这个问题提供更多的上下文,我有一个 Java 代码,它调用一个带有输入文件的工具。正如该工具将文件作为输入并运行一段时间,然后获取下一个文件,依此类推。我有一组 100,000 个文件需要提供给该工具。所以现在我正在尝试监视该特定工具(它在 Linux 中作为进程运行)。我无法将整个“顶部”数据捕获为文件,因为不需要的数据太大。如何仅捕获该进程的系统统计信息并使用 top 将其写入文件?

【问题讨论】:

  • 你想要什么统计数据?你知道“时间”吗?
  • 我想要 %CPU 和 %MEM 使用情况统计信息。我不认为“时间”会帮助我得到这些。
  • 时间最终会给你挂钟时间和处理器时间,这样你就可以计算cpu%的平均值。找出工具的 PID 并为该 PID 反复运行“ps”怎么样?
  • 这不起作用,因为该工具会不断关闭并再次重新打开。所以每次的PID都不一样。如果我可以使用工具的名称进行跟踪,那就太好了。
  • 哦,这可行。我对linux中的ps不熟悉。当我做 ps 时,我只是得到“时间”,你如何在 ps 中获得 CPU 和 MEM 等其他细节?我查看了手册页,但这似乎也没有帮助。

标签: linux file


【解决方案1】:

对我来说top -b > test.txt 将存储来自top 的所有输出,即使我用ctrl-c 打破它也是如此。我建议你先转储,然后grep 结果文件。

【讨论】:

  • 这样你也可以使用 less 或 tail -f 跟踪文件的增长
  • 请注意-b 标志特定于 GNU 版本的 top。这在大多数 linux 系统上都很好,但可能无法移植到基于 busybox 的系统或其他 unix 上。
  • 他使用了 -b 标志,所以我认为它可用
  • @dmckee 雅人注意到了。事实上,我试图用 a -b 在 Mac OSX 中解决同样的问题,但它没有用。发现top在OSX中没有批处理模式。
  • 我认为您的问题可能是由 grep 从输出中剥离换行符引起的,然后缓冲会吃掉所有输出,直到缓冲区用完或流结束。只是猜测。
【解决方案2】:

使用while循环和-n 1怎么样:

while sleep 3; do 
  top -b -n1 | grep init > top-output.txt
done

【讨论】:

  • 我会试试这个。因为上次我尝试类似的循环时,top 一旦退出列表就停止捕获进程,并且当进程返回列表时没有开始重新捕获。我会试一试,然后告诉你。
  • @Pradep,我认为它停止的原因是如果 while 条件中的最后一个命令失败,while 将停止。这就是 Thor 使用while :; 的原因。 : 是一个始终成功的特殊命令。我假设你做了while top ...; do ...; done
  • 需要>>来追加。并且可以在处理时清除。这将只有最新的。如果完成后处理,那很好
  • 我个人不鼓励使用第一次 top 迭代,因为它缺乏适当的平均值参考,afaik。见this thread
【解决方案3】:

在所有迭代完成之前,输出似乎不会写入文件。你可以通过这样的外部循环来解决这个问题:

touch top-output.txt
while true; do
    top -b | grep init >> top-output.txt
done

【讨论】:

  • 至少在我的 linux 机器上它将它作为流写入标准输出,因此输出文件是实时更新的。
  • 现在试试,我发现我把x的初始值设置错了,所以循环永远不会被执行。
  • 我是新手。你能告诉我如何阻止它运行吗?我试过 Ctrl-c 。但这在这里不起作用。 :)
  • 我已经编辑了一个在你按下 Ctrl-c 之前会一直运行的版本。
  • 仍然没有关闭 Ctrl-C 。 Ctrl - Z 虽然有效。我不知道它是否符合预期。
【解决方案4】:

这是我喜欢在我的 mac 上使用的 1-liner:

top -o -pid -l 1 | grep "some regexp"

干杯。

【讨论】:

    【解决方案5】:

    CTRL+C 不是一个理想的解决方案,因为控制留在 CLI 中。您可以使用以下命令将顶部输出转储到文件:

    top -n 1 -b > top-output.txt
    

    【讨论】:

      【解决方案6】:

      正如@Thor 在评论中指出的那样,您只需要使用--line-buffered 选项确保grep 不是任意缓冲而是每行

      top -bn 10 | grep 'init' --line-buffered | tee top-output.txt
      

      没有 grep-ing,将top 的输出重定向到一个文件就可以了,包括中断。

      【讨论】:

        【解决方案7】:

        我遇到了完全相同的问题...

        这是我的台词:

        top -b -u myUser | grep -v Prog.sh | grep Prog > myFile.txt
        

        它会创建 myFile.txt,但是当我 Ctrl+C 时它会是空的。所以在我启动了我的 top 命令之后,我开始了第二个 top 进程。当我找到第一个顶部的 PID(经过反复试验)并通过第二个顶部杀死它时,第一个顶部按预期写入文件。

        希望有帮助!

        【讨论】:

        • 输出缺失的原因是中间的grep会被缓冲。像这样运行它来避免这种情况:grep --line-buffered ...
        【解决方案8】:

        如果您希望在后台运行 top 命令(只是不用担心注销/睡眠等)- 您可以使用 nohup 或批处理作业或 cron 或屏幕。

        使用 nohup(代表:不挂断):

        假设如果您将 top 命令保存在名为 top-exec.sh 的文件中,其内容如下:

         top -p <PID> -b > /tmp/top.log
        

        您可以将 top 命令替换为您感兴趣的任何进程。 然后,您可以使用 nohup 执行 top-exec.sh,如下所示:

        $> nohup top-exec.sh &
        

        这会将 top 命令的所有输出重定向到一个名为 "top.log" 的文件。

        【讨论】:

          【解决方案9】:

          解决了这个问题。即使您按 Ctrl+c 这也有效,即使我想记录 Cpu% 时也遇到了同样的问题。 执行这个 shell 脚本:

          #!/bin/sh
          while true; do
              echo "$(top -b -n 1 | grep init)"  | tee -a top-output.log
              sleep 1
          done
          
          • 您可以 grep 任何您想从 top 命令中提取的内容,使用此脚本将其存储到文件中。
          • -b : 批处理模式操作 以批处理模式启动顶部,这对于将输出从顶部发送到其他程序或 到一个文件。在此模式下,top 将不接受输入并运行,直到您设置的迭代限制 使用 -n 命令行选项或直到被杀死。
          • -n number,此选项指定top 在结束前应该产生的最大迭代数或帧数。这里我使用了 -n 1
          • man top 了解更多详情
          • tee -a 使输出在控制台上可见,并将输出存储到文件中。 -a 选项将输出附加到文件中。
          • 在这里,我给出了 1 秒的间隔。您可以提及任何其他区间。

          -b 和 -n 的解释来源:手册页

          man top
          

          Kruthika

          【讨论】:

          【解决方案10】:

          top 命令中,我们可以看到所有进程及其 PID(进程 ID)。 要仅打印一个进程的顶部输出,请使用以下命令:

          $ top –p PID
          

          要将任何进程的 top 命令保存到文件中,请使用以下命令:

          top -p $PROCESS_ID -b  > top.log
          

          where > 将标准输出重定向到一个文件。

          【讨论】:

            猜你喜欢
            • 2016-05-01
            • 2014-10-30
            • 2015-12-26
            • 2017-02-05
            • 1970-01-01
            • 2010-12-19
            • 1970-01-01
            • 2022-06-15
            • 2019-07-20
            相关资源
            最近更新 更多