Jak mogę ograniczyć rozmiar zapisanego pliku dziennika >>
do 200 MB?
$ run_program >> myprogram.log
io-redirection
limit
size
David
źródło
źródło
Odpowiedzi:
Jeśli twoja aplikacja (tj.
run_program
) Nie obsługuje ograniczania rozmiaru pliku dziennika, możesz okresowo sprawdzać rozmiar pliku w pętli za pomocą zewnętrznej aplikacji lub skryptu.Możesz także użyć
logrotate(8)
do obracania dzienników, masize
parametr, którego możesz użyć do swoich celów:źródło
postscript
opcji, aby konfiguracja logrotate została wysłanaSIGHUP
do programu.Jeśli twój program nie musi zapisywać INNYCH plików, które byłyby większe niż ten limit, możesz poinformować jądro o tym limicie za pomocą
ulimit
. Przed uruchomieniem polecenia uruchom to, aby ustawić limit wielkości pliku 200 MB dla wszystkich procesów uruchomionych w bieżącej sesji powłoki:To ochroni twój system, ale może być niebezpieczne dla programu zapisującego plik. Jak sugeruje eyazici , rozważ skonfigurowanie
logrotate
plików dziennika do przycinania, gdy osiągną określony rozmiar lub wiek. Możesz odrzucić stare dane lub zarchiwizować je na pewien czas w szeregu skompresowanych plików.źródło
Możesz utworzyć nowy obraz systemu plików, zamontować go za pomocą urządzenia pętli i umieścić plik dziennika w tym systemie plików:
Możesz również użyć
tmpfs
zamiast pliku, jeśli masz wystarczającą ilość pamięci.źródło
Możesz obciąć dane wyjściowe za pomocą
head
:źródło
SIGPIPE
) po osiągnięciu limitu rozmiaru, zamiast odrzucania danych.dd
magią, ale tak @ Random832 ma rację, dostanieszSIGPIPE
ashead
/dd
/whatever
upuszcza.trap '' SIGPIPE
?{ head -c "$size" >> log; cat > /dev/null; }
.W pakiecie
apache2-utils
znajduje się narzędzie o nazwierotatelogs
, może być dla Ciebie pomocne.Streszczenie:
rotatelogs [-l] [-L linkname ] [-p program ] [-f] [-t] [-v] [-e] [-c] [-n liczba plików ] czas rotacji pliku dziennika | rozmiar pliku (B | K | M | G) [ offset ]
Przykład:
Pełny podręcznik można przeczytać pod tym linkiem .
źródło
Jestem pewien, że oryginalny plakat znalazł rozwiązanie. Oto kolejny dla innych, którzy mogą przeczytać ten wątek ...
Curtail ogranicza rozmiar danych wyjściowych programu i zachowuje ostatnie 200 MB danych wyjściowych za pomocą następującego polecenia:
Referencje
UWAGA: Jestem opiekunem powyższego repozytorium. Po prostu udostępniam rozwiązanie ...
źródło
Ponieważ jest to tekst, napisałbym skrypt w twoim ulubionym języku i dopasowałem go do tego. Niech poradzi sobie z plikiem I / O (lub zachowa to wszystko w pamięci, a następnie zrzuci na
SIGHUP
lub podobne). W tym celu zamiast 200 MB pomyślałbym o „rozsądnej” liczbie wierszy do śledzenia.źródło
syslog
ilogrotate
.Poniższy skrypt powinien wykonać zadanie.
Ma kilka oczywistych skrótów, ale ogólnie robi to, o co prosiłeś. Podzielą dziennik na kawałki o ograniczonym rozmiarze, a ilość kawałków jest również ograniczona. Wszystkie można określić za pomocą argumentów wiersza polecenia. Plik dziennika jest również określany za pomocą wiersza polecenia.
Zwróć uwagę na małą gotcha, jeśli używasz jej z demonem, który rozwidla się w tle. Użycie potoku uniemożliwi przejście demona w tło. W tym przypadku istnieje składnia (prawdopodobnie specyficzna dla bash), aby uniknąć problemu:
Zwróć uwagę, że
<&0
choć pozornie zbędne, nie będzie działać bez tego.źródło