Czy istnieje sposób na utworzenie specjalnych plików pod Linuksem, które zachowałyby tylko, powiedzmy 100 ostatnio napisanych linii? Mam proces wypełniania pliku dziennika i chciałbym regularnie analizować jego 100 ostatnich wierszy.
Wiem, że mógłbym użyć jakiegoś logrotatu, ale czy istnieje sposób na utworzenie specjalnego pliku, który wypełniałby się aż do osiągnięcia 100 wierszy, a następnie dodanie wiersza usuwa najstarszy, aby plik zachował tylko 100 wierszy? (rodzaj FIFO opartego na linii)
Wielkie dzięki
linux
filesystems
fifo
Daladim
źródło
źródło
tail
robi to, abyś mógł napisać zadanie cron, aby wypełnić plik w dowolnym interwale odświeżania, jaki chcesz. po prostu nadpisztail <file> > <targetfile>
. jeśli częstotliwość odświeżania jest wystarczająco wysoka, będzie działać jak bufor FIFO.cat
uzyskać pochodne treści (takie jak bufor pierścieniowy), ale nie są one zbyt popularne. Są to tak zwane systemy plików o strukturze dziennika. Byłoby idealne dla tego scenariusza. en.wikipedia.org/wiki/Log-structured_file_system . Na razie sugeruję, abyś napisał skrypt, który wykonuje dla siebie tail -n 100.tail
, ale cieszę się, że się czegoś nauczyłem :)Odpowiedzi:
Dzienniki są plikami tekstowymi (podobnymi) i dlatego takie dodawanie do nich nowych bloków dysku, gdy wymagają tego nowe linie, jest szybką akcją obsługiwaną przez dowolny system plików.
Jednak ciągłe porzucanie pierwszego wiersza, gdy nadchodzi nowy, oznaczałoby reorganizację przynajmniej niektórych, jeśli nie wszystkich bloków pliku STAŁO. Oznaczałoby to duży narzut związany z logowaniem, podczas gdy jedną z najważniejszych cech, które chcemy rejestrować, jest to, że jest lekki.
Systemy plików nie są na to przygotowane (przynajmniej nie słyszałem o tym typie), dlatego właśnie logowanie wspierane przez logrotate / tail / database jest używane tam, gdzie ważne są ostatnie rekordy.
źródło
Zakładając, że masz skrypt, który przetwarza tylko 100 ostatnich wierszy za każdym razem, gdy jest uruchamiany, te wiersze najlepiej przechwycić za pomocą
tail
polecenia, ponieważ robi to właściwie to, co chcesz zrobić. Kluczem jest tutaj-n
przełącznik, który określa, ile linii powinien przechwycić, zaczynając od końca.Możesz bezpośrednio wykonać skrypt
tail -n 100 somefile.log
w skrypcie lub możesz okresowo uruchamiaćtail -n 100 somefile.log > onlylast100lines.log
plik, który zawiera tylko ostatnie 100 wierszy. To drugie podejście przepisuje plik docelowy za każdym razem, więc nie trzeba go usuwać między każdym uruchomieniem.źródło
tail
(i w końcu z niego skorzystam), ale z ciekawości chciałem wiedzieć, czy istnieją funkcje Linuksa, o których nie wiedziałem, że to zadziała. W każdym razie dzięki.Opracowując metodę Jarmunds, możesz stworzyć skrypt bash w następujący sposób:
Spowoduje to parsowanie ostatnich 100 wierszy pliku somefile.log do onlylast100lines.log co 5 sekund. Plik byłby nadpisywany za każdym razem, więc zawsze będzie to tylko ostatnie 100 wierszy. Można to dodać do skryptu logowania lub do dowolnego poziomu uruchamiania, który ma być wykonywany.
źródło
tail
(i w końcu z niego skorzystam), ale z ciekawości chciałem wiedzieć, czy istnieją funkcje Linuksa, o których nie wiedziałem, że to zadziała. W każdym razie dzięki.