用linuxbash处理数据流
我正在处理来自babeltrace命令的实时流数据。该命令将连续输出日志。现在我想分离这些日志并保存到不同的文件中。例如,0~10秒之间的日志保存到文件1,10~20秒之间的日志保存到文件2。。。 在同时执行命令时,是否可以使用Linux bash实现此功能 我试过:用linuxbash处理数据流,linux,bash,stdout,Linux,Bash,Stdout,我正在处理来自babeltrace命令的实时流数据。该命令将连续输出日志。现在我想分离这些日志并保存到不同的文件中。例如,0~10秒之间的日志保存到文件1,10~20秒之间的日志保存到文件2。。。 在同时执行命令时,是否可以使用Linux bash实现此功能 我试过: babeltrace --input-format=lttng-live Test | tee file1 file2 ... 但是tee将重定向所有文件中的所有内容。如果您想要任何健壮的东西,您确实需要编写一个程序来
babeltrace --input-format=lttng-live Test | tee file1 file2 ...
但是tee将重定向所有文件中的所有内容。如果您想要任何健壮的东西,您确实需要编写一个程序来执行此操作。您可以尝试以下方法:
babeltrace --input-format=lttng-live Test | { i=0; while : $((i++)); do
timeout 10 sh -c "cat > file-$i"; done; }
但在生产环境中,我不相信这一点
==编辑==
在生产环境中,您不应该相信这一点的原因。我不知道timeout
和cat
的实现细节,即使我很了解它们,我也不相信它们不会(随着时间或平台)改变。我怀疑timeout
将发送终止外壳的信号。如果cat
已读取一些数据但尚未写入,会发生什么情况?cat
是否会正常终止并刷新其所有缓冲区,或者是否会丢弃任何未写入的数据?timeout
是否发送一个TERM
或INT
或(喘息)一个KILL
?这种行为标准化了吗?当接收到信号时,cat
将正常终止,这是否标准化了?我不知道,仅仅编写一个健壮的程序来处理这些问题要比试图依靠timeout
和cat
更容易
另一个想法(我仍然不相信这是可靠的):
这里的基本思想是让单个awk进程读取babeltrace的输出,并每隔10秒向输出流中写入一个指示符,从而导致awk更改输出文件。请注意,如果输出流包含与“^SENTINEL”匹配的行,则该行将被丢弃。一个稍微稳健一点的方法是(咳嗽,咳嗽,幽默我在这里)让awk注册一个信号处理程序来更改输出文件名,并让一个计时器向它发送信号,但是A)我不知道你是否可以注册信号处理程序,除了深奥的awk,b)说真的,我说过这会更稳健吗?!如果您希望该进程运行很长时间,那么您可能也希望关闭awk中的输出文件 谢谢你的建议。事实证明,当传入流很大时,超时是没有用的。一些未写入的数据将被丢弃。所以我将编写一些程序来实现这个功能。
{ while sleep 10; do echo SENTINEL; done & babeltrace ...; } |
awk '/^SENTINEL/{of="output-file" idx++; next} {print > of}' of=output-file0