Постоянно сохранять хвост стандартного ввода

У меня есть программа, которая генерирует большие журналы на стандартный вывод. На самом деле меня не волнует журнал, но я хочу знать последние 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()
Другие вопросы по тегам