我有两个以可排序的timesetamp为前缀的日志文件.
我希望按顺序看到它们,而生成日志文件的进程仍在运行.这是一个非常忠实的模拟情况:
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
解决方法:
solution using 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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。