我有两个日志文件,前缀可sorting的时间安排。 我想依次看到它们,而生成日志文件的进程仍在运行。 这是一个非常忠实的模拟情况:
slow() { # print stdout at 30bps exec pv -qL 30 } timestamp() { # prefix stdin with a sortable timestamp exec tai64n } # Simulate two slowly-running batch jobs: seq 000 099 | slow | timestamp > seq.1 & seq1=$! seq 100 199 | slow | timestamp > seq.2 & seq2=$! # I'd like to see the combined output of those two logs, in timestamp-sorted order try1() { # this shows me the output as soon as it's available, # but it's badly interleaved and not necessarily in order tail -f seq.1 --pid=$seq1 & tail -f seq.2 --pid=$seq2 & } try2() { # this gives the correct output, # but outputs nothing till both jobs have stopped sort -sm <(tail -f seq.1 --pid=$seq1) <(tail -f seq.2 --pid=$seq2) } try2 wait
使用tee (编写文件以使标准输出仍然到控制台)的解决方案将不起作用,因为tee引入了不需要的延迟并且不能解决问题。 同样,我不能使用tail -f -s 0.01 (将轮询更改为100 / s)和/或某种调用如split --filter='sort -sm'来分类小批量。
我也没有tai64n ,所以我的测试代码实际上使用了这个功能相同的Perl代码:
tai64n() { perl -MTime::HiRes=time -pe ' printf "\@4%015x%x%n", split(/\./,time), $c; print 0 x(25-$c) . " "' }
在没有用sh和bash解决这个问题之后,我运行了标准的故障转移, perl :
slow() { # print stdout at 30bps pv -qL 30 } tai64n_and_tee() { # prefix stdin with a sortable timestamp and copy to given file perl -MTime::HiRes=time -e ' $_ = shift; open(TEE, "> $_") or die $!; while (<>) { $_ = sprintf("\@4%015x%x%n", split(/\./,time), $c) . 0 x(25-$c) . " $_"; print TEE $_; print $_; } ' "$1" } # Simulate two slowly-running batch jobs: seq 000 099 | slow | tai64n_and_tee seq.1 & seq 100 199 | slow | tai64n_and_tee seq.2 & wait
这对我来说很方便,因为我已经使用perl作为时间戳了。 我没有做到这一点, perl作为tai64n和一个单独的perl调用作为tee ,但它可能与真正的tai64n 。