持续保存标准输入的尾部

持续保存标准输入的尾部

我有一个程序会在标准输出上生成大量日志。实际上我并不关心日志,但我确实想知道程序完成或崩溃时最后 1000 行左右的内容。

我想要介于“tail -f”和“> log”之间的某个命令。也就是说,我想要监视输出并将其放入日志文件中,但连续只将最后 1000 行保存到文件中。如果我执行“tail -f >log”,这会连续保存所有内容,日志文件会变得太大。如果我执行“tail -f”,我可以监视输出的尾部。

我想要的是理论上可以做到的事情,

$ program >log &
$ while true; do sleep 1s; tail -n1000 log > saved_log; done

log由于尺寸过大,中间没有生产。有这样的工具吗?

最好使用标准 Unix 工具包,但我也愿意接受建议。

答案1

我想要一个更好的答案,但与此同时,我编写了这个糟糕的 Python 脚本。一定有某种标准可以做到这一点...

$ cat proposed/box-restart/loglast1000.py 
#!/usr/bin/env python

from __future__ import print_function
import sys, time

fn = sys.argv[1]
last1000 = []

def output_last1000():
    with file(fn,'w') as output:
        for l in last1000:
            print(l, end='', file=output)

t = time.time()
for line in sys.stdin:
    last1000.append(line)
    if len(last1000) > 2000:
        last1000 = last1000[1000:]
    if time.time() - t > 0.5:
        output_last1000()

output_last1000()

相关内容