我正在处理来自babeltrace命令的实时流数据。该命令将连续输出日志。现在,我想将这些日志分开并保存到其他文件中。例如,将0〜10秒之间的日志保存到file1,将10〜20秒之间的日志保存到file2 ... 同时执行命令时,是否可以使用Linux bash实现此功能?
我尝试过:
babeltrace --input-format=lttng-live Test | tee file1 file2 ...
但是tee会重定向所有文件中的所有内容。
答案 0 :(得分:1)
如果您想要强大的功能,则确实需要编写一个程序来执行。您可以尝试以下方法:
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
或(gasp)发送KILL
?该行为是否标准化?是否已标准化cat
在收到信号时会正常终止的信息?我不知道,编写一个处理这些问题的健壮程序要比依靠timeout
和cat
容易。
另一个想法(我仍然不相信它会很健壮):
{ while sleep 10; do echo SENTINEL; done & babeltrace ...; } |
awk '/^SENTINEL/{of="output-file" idx++; next} {print > of}' of=output-file0
这里的基本思想是,让单个awk进程读取babeltrace的输出,并每10秒将一个指示符写入输出流,这会导致awk更改输出文件。请注意,如果您的输出流包含与“ ^ SENTINEL”匹配的行,则将其丢弃。一种更健壮的方法是(让咳嗽,咳嗽,在这里让我感到幽默)让awk注册一个信号处理程序,该处理程序更改输出文件名并让计时器发送一个信号,但是a)我不知道是否您可以向任何神秘的awk注册信号处理程序,并且b)认真地说,我说这会更强大吗?如果您希望该过程运行很长时间,则可能还需要在awk中关闭输出文件。