【问题标题】:bash, nested commands and redirectsbash、嵌套命令和重定向
【发布时间】:2012-01-25 22:24:07
【问题描述】:

我正在尝试使用如下命令跟踪进程的 CPU 使用率:

    top -b -d 1 | grep myprocess.exe

接下来,我想把它重定向到一个日志文件,例如

    top -b -d 1 | grep myprocess.exe > output.log

现在,这实际上不起作用,因为它认为我正在 grepping myprocess.exe > output.log 而不是 myprocess.exe

有人知道我怎样才能让这个重定向起作用吗?

【问题讨论】:

  • 为什么你认为重定向是grepping?重定向由bash 解释,并且不会进入进程名称
  • top -b -d 1 | grep postgres > output.log 在我的机器上工作(Ubuntu 10.04 LTS)。
  • 也许是这样,但仍然无法解释为什么我运行第二个命令时 output.log 为空。
  • 你使用的是什么环境? (发行版,命令外壳)

标签: bash redirect command nested pipe


【解决方案1】:

现在,这实际上不起作用,因为它认为我在 grepping myprocess.exe > output.log 而不是 myprocess.exe

错了。一切都应该没问题。第一个示例执行管道并将stdout 设置为终端(因此您可以看到输出,但没有任何内容写入文件)。第二个示例执行管道时将stdout 设置为output.log(因此您看不到输出,但它会直接出现在您的文件中)。

如果您希望将输出写入两者,您需要另一个进程,将您以前的管道的stdout 获取为stdin,并复制它。喜欢:

previous_pipeline | tee output.log

tee 将在标准输出上打印它在stdin 上得到的内容(所以对于stdout,一切都和以前一样),但另外打开另一个文件(作为 cmdline arg 给出)并写入一个副本。

【讨论】:

    【解决方案2】:

    试试tee:

    top -b -d 1 | grep myprocess.exe | tee output.log
    

    如果你想让它不显示输出:

    top -b -d 1 | grep myprocess.exe | tee output.log > /dev/null
    

    【讨论】:

    • 所以 tee 似乎不适合我。我得到与以前相同的结果(例如 output.log 为空)。
    • 抱歉,第二个示例与 OP 的第二个示例基本相同。第一个例子应该是解决方案。
    • 实际上,我尝试了上面的第一个示例,但仍然给出了一个空的 output.log。有什么想法吗?
    • @user788171:在我的系统上,tee 似乎收集了一些输出并以更大的突发写入(而grep 只是尽快写入,所以-d 1 选项top 有效果,现在没有)。您可以对此感到满意,或者对正在写入的文件使用仅文件解决方案(尝试tail -f FILE | less)。
    猜你喜欢
    • 2019-04-22
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2013-05-17
    相关资源
    最近更新 更多