Łatwy sposób na ograniczenie rozmiaru pliku (standardowe wyjście) na poziomie skryptu powłoki?

10

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ę.

mdrozdziel
źródło

Odpowiedzi:

16

Możesz użyć headdo tego:

command | head -c 1G > /var/tmp/output.log

Akceptuje K, M, G i tym podobne jako sufiksy (bajty są domyślne). Dodaj „B”, aby użyć wersji podstawowej 10.

Eduardo Ivanec
źródło
głowa ponownie ściana To nie może być prostsze. Dzięki!
mdrozdziel
2
Wydaje się, że tail -c 1Gdziała, warto spojrzeć na ogon wydarzenia. Zrozumiałe, że opróżnia się po zakończeniu polecenia.
dashy
Jednostka dla sufiksów nie działa w systemie Mac OS.
anumi
0

Ustaw maksymalny rozmiar pliku dla użytkownika, który będzie używany tylko do uruchamiania tych skryptów.

Plik /etc/security/limitsogranicza 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.

Chris Ting
źródło
0

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 ...

Dave Wolaver
źródło
0

Możesz ograniczyć dowolny plik za pomocą

tail -c 1G myLog.log > myLog.tmp
mv myLog.tmp > myLog.log

Zapisanie ogona bezpośrednio do tego samego pliku tworzy pusty plik. Musisz więc użyć pliku tymczasowego.

Séverin
źródło
tail -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.log to zabije dziennik, myślę, że chciałeś użyć >> zamiast> czy nie?
djdomi
Celem tego polecenia jest przepisanie dziennika tylko ostatnim 1G. >> powinno być dla poprzedniego polecenia: doSomething >> myLog.log; tail -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
Séverin,