我正在处理babeltrace命令的实时流数据。该命令将连续输出log。现在,我想将这些日志分开并保存到不同的文件中。例如,0~10秒之间的日志保存到file1,10~20秒之间的日志保存到file2 ...在执行该命令的同时,是否可以使用Linux bash实现此功能?
我试过了:
babeltrace --input-format=lttng-live Test | tee file1 file2 ... 但tee将重定向所有文件中的所有内容。
发布于 2019-09-18 23:05:43
如果你想要健壮的东西,你真的只需要写一个程序就可以了。您可以尝试如下所示:
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中的输出文件。
https://stackoverflow.com/questions/57995343
复制相似问题