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