Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用linuxbash处理数据流_Linux_Bash_Stdout - Fatal编程技术网

用linuxbash处理数据流

用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命令的实时流数据。该命令将连续输出日志。现在我想分离这些日志并保存到不同的文件中。例如,0~10秒之间的日志保存到文件1,10~20秒之间的日志保存到文件2。。。 在同时执行命令时,是否可以使用Linux bash实现此功能

我试过:

    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