有人知道我如何将输出管道传输到文件,直到文件大小达到限制或被其他条件取消?这可能吗?
如何在文件大小、持续时间等条件下取消将输出写入文件('$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.