Ok, z mojego punktu widzenia jest to bardzo praktyczny przypadek użycia.
Powiedzmy, że mam prosty oneliner powłoki, który rejestruje dane wyjściowe w pliku. Może to być po prostu wszystko, na przykład tcpdump. Czy istnieje jakiś ogólny i trywialny sposób, aby upewnić się, że plik wyjściowy nie przekroczy określonego rozmiaru?
Rezonowanie za tym polega na tym, aby przez pomyłkę zabezpieczyć przed zapełnieniem całej dostępnej przestrzeni w punkcie montażu. Jeśli zapomnę o skrypcie lub da on GB danych na godzinę, to proste zadanie debugowania może doprowadzić do potencjalnej awarii systemu.
Teraz jestem świadom opcji wbudowanych w niektóre z narzędzi (takich jak kombinacja -W / -C w tcpdump). Potrzebuję bardzo ogólnego zabezpieczenia przed awarią.
Krótka historia - kiedy uruchamiam skrypt taki jak:
% this -is --my=very|awsome|script >> /var/tmp/output.log
Jak upewnić się, że plik output.log nigdy nie będzie większy niż 1 GB.
Skrypt może ulec awarii, zostać zabity lub cokolwiek innego.
Rozwiązanie, którego szukam, powinno być łatwe i proste, używając tylko narzędzi dostępnych w popularnych dystrybucjach, takich jak ubuntu / debian / fedora. Ogólnie coś powszechnie dostępnego. Skomplikowany, wielowierszowy program nie jest tu opcją bez względu na język / technologię.
tail -c 1G
działa, warto spojrzeć na ogon wydarzenia. Zrozumiałe, że opróżnia się po zakończeniu polecenia.Ustaw maksymalny rozmiar pliku dla użytkownika, który będzie używany tylko do uruchamiania tych skryptów.
Plik
/etc/security/limits
ogranicza użytkownika wartościami „default”, chyba że istnieją konkretne wartości dla konkretnego użytkownika. Te wartości specyficzne dla użytkownika zastąpią wartości domyślne. Plik może mieć nieco inną nazwę w zależności od systemu operacyjnego.Jeśli użytkownik dziennika ma nazwę log_maker, dodaj ten wiersz do pliku:
log_maker hard fsize 1000000
Liczba po fsize to maksymalny rozmiar pliku w KB.
źródło
ograniczenie ogranicza rozmiar danych wyjściowych programu i zachowuje ostatnie X KB danych wyjściowych za pomocą następującego polecenia:
Run_program | curtail -s 1G mójprogram.log
https://github.com/Comcast/Infinite-File-Curtailer
UWAGA: Jestem opiekunem powyższego repozytorium. Po prostu udostępniam rozwiązanie ...
źródło
Możesz ograniczyć dowolny plik za pomocą
Zapisanie ogona bezpośrednio do tego samego pliku tworzy pusty plik. Musisz więc użyć pliku tymczasowego.
źródło