у меня есть ./program
, который выводит много сообщений журнала, а также имеет очень ограниченное пространство для хранения на моем VPS:
я хотел бы, чтобы мой лог-файл содержал только последние N строк все время (точнее когда я кончаю ^C моя программа или когда она падает...)
A. I do не хочу следующее:
-
"перенаправить вывод в файл (log -), а затем используйте
tail
сохранить только последние N строк."Ну лог-файл все равно займет драгоценное место, пока я не запущу
tail
на нем, что делает его бессмысленным... Я могу настроить cronjob, чтобы делать это периодически, если у меня нет другого выбора, но я хотел бы сначала изучить возможности. -
" Use
logrotate
."logrotate
кажется, правильное решение проблемы, но это слишком много хлопот, и я хочу что-то проще, предпочтительно то, что я могу сделать с трубами и перенаправлениями.
B. я попробовал следующее:
(заменить ./program
С seq 1000000
если для тестирования)
-
seq 1000000 | tee /dev/fd/2 | tail -n 10 > logfile
работает прекрасно, когда он завершается сам по себе, но когда я прерываю ^C это я,
logfile
пусто (в то время как я ожидаю, что он будет содержать последние 10 строк, которые напечатано на экранеtee
) -
mkfifo fifo; tail fifo -n 10 > logfile & seq 1000000 | tee fifo
работает прекрасно, когда он завершается сам по себе, но когда я прерываю ^C это я,
logfile
is не пустыми, но также не содержит немного последних записей журнала, которые будут напечатаны на экране:
.
$ tail fifo -n 10 > logfile & seq 1000000 | tee fifo
[1] 2616
1
2
3
⋮
480178
480179
480180
480181
480182
480183
^C
[1]+ Done tail fifo -n 10 > logfile
$ cat logfile
479297
479298
479299
479300
479301
479302
479303
479304
479305
здесь вы можете увидеть, что последние записи находятся на 480 тысяч, в то время как последняя запись в logfile
это 479,305... смысл я скучаю 878 последние строки! Я думаю, что это связано с буферизацией, но я не уверен.
может ли кто-нибудь показать мне, как это сделать, используя только shell и (желательно стандартные) утилиты Linux? Спасибо!