使用top
带有重定向的命令效果很好:
top > top.log
现在我想使用 grep 来过滤某一行:
top | grep "my_program" > top.log
但日志文件将保持为空。但是 grep 在使用时会提供输出
top | grep "my_program"
必须将其中my_program
替换为正在运行的程序才能看到一些输出。
为什么我的方法不起作用?我该如何解决它?
答案1
我得到了与你描述的相同的行为。在 Ubuntu 11.10 上
top | grep "my_program" > top.log
不产生任何输出。
我相信其原因是 grep 正在缓冲其输出。要告诉 GNU grep 逐行输出输出,请使用以下--line-buffered
选项:
top | grep --line-buffered "my_program" > top.log
另请参阅此那么问题其他潜在的解决方案。
答案2
你应该使用:
top -n 1 | grep "blah" > top.log
“-n 1”在一次迭代中运行顶部,然后退出,而不是每隔几秒不断更新
因为你只是在寻找一行,尽管 ps 是一个更好使用的工具。
答案3
我解决这个问题的方法是:
while :;do top -b -n 1 | grep "my_program" >> top.log;done &
通过这种方式,我可以在后台为 my_program 提供一个正在运行的监视器,并将所有结果保存在文件 top.log 中。
答案4
虽然两者都对我有用,但我认为 Lev Levitsky 的建议是正确的。使用-b
论证。
输出重定向很可能是问题所在,并且您没有通过 stdout 获取任何内容,因此请尝试以下操作:
top -b 2>&1 | grep "my_program" > top.log
请注意,您也可能会遇到输出缓冲问题。您的 shell 不会不断写入该文件,因此可能需要一段时间才能top.log
填充。