37

我想将特定“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 将其写入文件?

4

10 回答 10

40

对我来说top -b > test.txttop即使我用ctrl-c. 我建议你先转储,然后再转储grep文件。

于 2012-07-30T21:22:02.317 回答
13

如何使用while循环和-n 1

while sleep 3; do 
  top -b -n1 | grep init > top-output.txt
done
于 2012-07-30T21:35:44.527 回答
5

看起来在所有迭代完成之前输出不会写入文件。您可以通过使用如下外部循环包装来解决此问题:

touch top-output.txt
while true; do
    top -b | grep init >> top-output.txt
done
于 2012-07-30T21:26:19.513 回答
2

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

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

干杯。

于 2015-05-12T19:20:45.817 回答
1

解决了这个问题。即使您按 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,这对于将输出从top发送到其他程序或文件可能很有用。在这种模式下,top 将不接受输入并运行,直到您使用 -n 命令行选项设置的迭代限制或直到被杀死。
  • -n number,此选项指定在结束前 top 应该产生的最大迭代数或帧数。在这里,我使用了 -n 1
  • 了解man top更多详情
  • tee -a 使输出在控制台上可见,并将输出存储到文件中。-a 选项将输出附加到文件中。
  • 在这里,我给出了 1 秒的间隔。您可以提及任何其他间隔。

-b 和 -n 的解释来源:联机帮助页

man top

克鲁西卡

于 2017-09-13T06:02:41.303 回答
1

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

top -n 1 -b > top-output.txt
于 2018-04-11T16:29:05.770 回答
1

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

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

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

于 2018-04-16T13:31:12.170 回答
0

我有同样的问题...

这是我的台词:

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

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

希望有帮助!

于 2012-12-17T21:42:10.387 回答
0

如果您希望在后台运行 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"的文件。

于 2016-02-26T18:40:15.457 回答
-1

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

$ top –p PID

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

top -p $PROCESS_ID -b  > top.log

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

于 2016-02-16T03:11:58.900 回答