【发布时间】:2014-09-12 07:54:25
【问题描述】:
有谁知道我如何通过管道输出到文件,直到文件大小达到限制或被其他条件取消?这可能吗?
如何取消将输出写入文件 ('$cmd >> file.txt 2>&1') 与文件大小、持续时间等条件...?
编辑:我启动一个应用程序,我需要前 1000 行输出,而无需停止应用程序本身!不需要记录完整的应用程序生命周期。
【问题讨论】:
有谁知道我如何通过管道输出到文件,直到文件大小达到限制或被其他条件取消?这可能吗?
如何取消将输出写入文件 ('$cmd >> file.txt 2>&1') 与文件大小、持续时间等条件...?
编辑:我启动一个应用程序,我需要前 1000 行输出,而无需停止应用程序本身!不需要记录完整的应用程序生命周期。
【问题讨论】:
例子:
seq 10000 | tee -i somefile | head -n 1000
这会将 seq 中的所有数据捕获到 somefile 中,并且 1000 行将打印到 stdout。您必须使用 tee -i 忽略中断,否则当 head 结束时它会中断 tee 从而中断 seq。
【讨论】:
seq 将完成工作,而 OP 希望看到 without stopping the application itself!
对于时间限制,请使用timeout。对于大小限制,请使用tee --max-bytes。
如果您寻求的是日志文件管理,您应该考虑使用rsyslogd,它会为您处理日志轮换、大小、时间等。
【讨论】:
--max-bytes。在我的 RHEL 上它也不可用:tee: unrecognized option '--max-bytes'
我需要前 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.
【讨论】: