Einfache Möglichkeit, die Dateigröße (stdout) auf Shell-Skriptebene zu begrenzen?


10

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.

Antworten:


16

Sie können dafür verwenden head:

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

Es akzeptiert K, M, G und dergleichen als Suffixe (Bytes sind die Standardeinstellungen). Fügen Sie 'B' hinzu, um die Basis-10-Versionen zu verwenden.


Kopf gegen Wand Es könnte nicht einfacher sein. Vielen Dank!
mdrozdziel

2
Es scheint tail -c 1Gauch zu funktionieren, nützlich, um den Schwanz eines Ereignisses zu betrachten. Verständlicherweise wird es nach dem Ende des Befehls gespült.
Bindestrich

Die Einheit für Suffixe funktioniert unter Mac OS nicht.
Anumi

0

Legen Sie die maximale Dateigröße für einen Benutzer fest, der nur zum Ausführen dieser Skripts verwendet wird.

Die Datei /etc/security/limitsbeschrä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.



0

Sie können jede Datei mit einschränken

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

Wenn Sie den Schwanz direkt in dieselbe Datei schreiben, wird eine leere Datei erstellt. Sie müssen also eine temporäre Datei verwenden.


tail -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.log dies wird das Protokoll töten, ich denke du wolltest >> anstelle von> verwenden oder nicht?
Djdomi

Der Zweck dieses Befehls besteht darin, das Protokoll nur mit dem letzten 1G neu zu schreiben. Das >> sollte für den vorherigen Befehl stehen: doSomething >> myLog.log; tail -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
Séverin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.