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