Ok, dies ist aus meiner Sicht ein sehr praktischer Anwendungsfall.
Angenommen, ich habe einen einfachen Shell-Oneliner, der die Ausgabe in einer Datei protokolliert. Dies kann einfach alles sein, zum Beispiel tcpdump. Gibt es eine generische und triviale Möglichkeit, um sicherzustellen, dass die Ausgabedatei die angegebene Größe nicht überschreitet?
Das Resoning dahinter soll verhindern, dass versehentlich der gesamte verfügbare Platz auf dem Montagepunkt ausgefüllt wird. Wenn ich das Skript vergesse oder es GBs Daten pro Stunde liefert, kann diese einfache Debugging-Aufgabe zu einem möglichen Systemabsturz führen.
Jetzt sind mir die Optionen bekannt, die in einigen Tools enthalten sind (wie die Kombination von -W / -C in tcpdump). Was ich brauche, ist eine sehr generische Ausfallsicherheit.
Lange Rede, kurzer Sinn - wenn ich ein Skript wie das folgende ausführe:
% this -is --my=very|awsome|script >> /var/tmp/output.log
So stellen Sie sicher, dass output.log niemals größer als 1 GB wird.
Skript kann abstürzen, getötet werden oder was auch immer.
Die von mir gesuchte Lösung sollte einfach und unkompliziert sein und nur Tools verwenden, die in gängigen Distributionen wie Ubuntu / Debian / Fedora verfügbar sind. Im Allgemeinen etwas weit verbreitetes. Kompliziertes, mehrzeiliges Programm ist hier unabhängig von Sprache / Technologie keine Option.
tail -c 1G
auch zu funktionieren, nützlich, um den Schwanz eines Ereignisses zu betrachten. Verständlicherweise wird es nach dem Ende des Befehls gespült.Legen Sie die maximale Dateigröße für einen Benutzer fest, der nur zum Ausführen dieser Skripts verwendet wird.
Die Datei
/etc/security/limits
beschränkt einen Benutzer auf die Werte "Standard", es sei denn, es gibt explizite Werte für einen bestimmten Benutzer. Diese benutzerspezifischen Werte überschreiben die Standardwerte. Die Datei kann je nach Betriebssystem einen etwas anderen Namen haben.Wenn Ihr Protokollbenutzer log_maker heißt, fügen Sie diese Zeile zur Datei hinzu:
log_maker hard fsize 1000000
Die Zahl nach fsize ist die maximale Dateigröße in KB.
quelle
Die Einschränkung begrenzt die Größe der Programmausgabe und behält die letzten X KB der Ausgabe mit dem folgenden Befehl bei:
run_program | beschneiden -s 1G myprogram.log
https://github.com/Comcast/Infinite-File-Curtailer
HINWEIS: Ich bin der Betreuer des oben genannten Repos. Einfach die Lösung teilen ...
quelle
Sie können jede Datei mit einschränken
Wenn Sie den Schwanz direkt in dieselbe Datei schreiben, wird eine leere Datei erstellt. Sie müssen also eine temporäre Datei verwenden.
quelle