Linux:在文件中管道输出,直到



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

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

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

示例:

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

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

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

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

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

1)我认为实现这一点的一个简单方法是使用两个规则向sed进行管道传输。第一条规则"11000W-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'

参考文献:

  • http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-how-to-execute-multiple-sed-commands/

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.

相关内容

最新更新