Назад | Перейти на главную страницу

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

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

Я хотел бы получить ответ получше, но тем временем я написал этот ужасный маленький скрипт на 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()