【问题标题】:Linux: Pipe output in File untilLinux:文件中的管道输出直到
【发布时间】:2014-09-12 07:54:25
【问题描述】:

有谁知道我如何通过管道输出到文件,直到文件大小达到限制或被其他条件取消?这可能吗?

如何取消将输出写入文件 ('$cmd >> file.txt 2>&1') 与文件大小、持续时间等条件...?

编辑:我启动一个应用程序,我需要前 1000 行输出,而无需停止应用程序本身!不需要记录完整的应用程序生命周期。

【问题讨论】:

    标签: linux shell pipe logfile


    【解决方案1】:

    例子:

    seq 10000 | tee -i somefile | head -n 1000

    这会将 seq 中的所有数据捕获到 somefile 中,并且 1000 行将打印到 stdout。您必须使用 tee -i 忽略中断,否则当 head 结束时它会中断 tee 从而中断 seq。

    【讨论】:

    • 但是,您的示例中的 seq 将完成工作,而 OP 希望看到 without stopping the application itself!
    • @skwllsp 我将其更改为使用 'tee -i'。它应该允许 seq 继续。
    【解决方案2】:

    对于时间限制,请使用timeout。对于大小限制,请使用tee --max-bytes

    如果您寻求的是日志文件管理,您应该考虑使用rsyslogd,它会为您处理日志轮换、大小、时间等。

    【讨论】:

    【解决方案3】:

    我需要前 1000 行的输出,而不需要停止应用程序本身!

    1) 我认为一个简单的方法是使用两个规则通过管道传输到sed。第一条规则'1,1000w head-lines.txt'用于保存到文件head-lines.txt,第二条规则用于打印。

    写入文件的前 1000 行,打印所有行:

    $ seq 1000000000000 | sed -n -e '1,1000w head-lines.txt' -e '1,$p'
    

    写入文件前 1000 行,打印所有行,从 1001 开始:

    $ seq 1000000000000 | sed -n -e '1,1000w head-lines.txt' -e '1001,$p'
    

    参考资料:

    2) 更复杂一点的方法是在 bash 中处理 SIGPIPE。在 bash 中,我将运行 seq 100000000,它在我的服务器上运行很长时间,并且仅在文件中获取其输出的前 1000 行:

    $ trap "" SIGPIPE && seq 100000000 2>/dev/null  | head -n 1000 > your.log 
    

    head 将获得前 1000 行时,它将结束并且通常 SIGPIPE 将被发送到seq。但是我打电话给trap 以忽略SIGPIPE:

    $ help trap
    trap: trap [-lp] [[arg] signal_spec ...]
        Trap signals and other events.
    
        If ARG is the null string each SIGNAL_SPEC is ignored by the
        shell and by the commands it invokes.
    

    【讨论】:

      猜你喜欢
      • 2017-06-21
      • 2013-05-25
      • 2011-01-20
      • 1970-01-01
      • 2011-06-28
      • 2015-09-18
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多