Wie kann ich die Größe einer mit >>
200 MB geschriebenen Protokolldatei begrenzen?
$ run_program >> myprogram.log
io-redirection
limit
size
David
quelle
quelle
Antworten:
Wenn Ihre Anwendung (d. H.
run_program
) Die Beschränkung der Größe der Protokolldatei nicht unterstützt, können Sie die Dateigröße regelmäßig in einer Schleife mit einer externen Anwendung oder einem externen Skript überprüfen.Sie können auch verwenden
logrotate(8)
, um Ihre Protokolle zu drehen, es hatsize
Parameter, die Sie für Ihren Zweck verwenden können:quelle
postscript
Option verwenden, um die Logrotate-Konfiguration dannSIGHUP
an das Programm senden zu lassen.Wenn Ihr Programm keine ANDEREN Dateien schreiben muss, die dieses Limit überschreiten, können Sie den Kernel über dieses Limit informieren
ulimit
. Bevor Sie Ihren Befehl ausführen, führen Sie diesen Befehl aus, um eine maximale Dateigröße von 200 MB für alle in Ihrer aktuellen Shell-Sitzung ausgeführten Prozesse festzulegen:Dadurch wird Ihr System geschützt, es kann jedoch sein, dass das Programm die Datei schreibt. Wie eyazici vorschlägt , sollten Sie in Betracht ziehen
logrotate
, Protokolldateien zu bereinigen , sobald sie eine bestimmte Größe oder ein bestimmtes Alter erreicht haben. Sie können alte Daten verwerfen oder für einen bestimmten Zeitraum in einer Reihe komprimierter Dateien archivieren.quelle
Sie können ein neues Dateisystem-Image erstellen, es mit einem Loop-Gerät mounten und die Protokolldatei auf diesem Dateisystem ablegen:
Sie können auch
tmpfs
anstelle einer Datei verwenden, wenn Sie über genügend Arbeitsspeicher verfügen.quelle
Sie können die Ausgabe abschneiden mit
head
:quelle
SIGPIPE
) wahrscheinlich beendet wird, sobald es die Größenbeschränkung erreicht hat, anstatt die Daten zu verwerfen.dd
Magie aber ja @ Random832 richtig ist , werden Sie eine bekommenSIGPIPE
alshead
/dd
/whatever
es fällt.trap '' SIGPIPE
?{ head -c "$size" >> log; cat > /dev/null; }
.In Paket
apache2-utils
ist vorhandenes Dienstprogramm genanntrotatelogs
, es kann für Sie hilfreich sein.Zusammenfassung:
rotatelogs [-l] [-L Linkname ] [-p Programm ] [-f] [-t] [-v] [-e] [-c] [-n Anzahl Dateien ] Logdatei- Rotationszeit | Dateigröße (B | K | M | G) [ Versatz ]
Beispiel:
Vollständiges Handbuch können Sie auf diesem Link lesen .
quelle
Ich bin sicher, das Originalplakat hat eine Lösung gefunden. Hier ist noch eine für andere, die diesen Thread lesen können ...
Mit dem folgenden Befehl wird die Größe der Programmausgabe begrenzt und die letzten 200 MB werden beibehalten:
Verweise
HINWEIS: Ich bin der Betreuer des obigen Repos. Einfach die Lösung teilen ...
quelle
Da es sich um Text handelt, würde ich ein Skript in Ihrer Lieblingssprache schreiben und es dazu weiterleiten. Lassen Sie es die Datei-E / A handhaben (oder speichern Sie alles im Speicher und sichern Sie es anschließend auf
SIGHUP
oder ähnlichem). Dafür würde ich mir anstelle von 200 MB eine "vernünftige" Anzahl von Zeilen überlegen, um den Überblick zu behalten.quelle
syslog
und Weise erstellt wurdenlogrotate
.Das folgende Skript sollte den Job erledigen.
Es hat ein paar offensichtliche Abkürzungen, aber insgesamt macht es, was Sie gefragt haben. Das Protokoll wird in Blöcke mit einer begrenzten Größe aufgeteilt, und die Anzahl der Blöcke ist ebenfalls begrenzt. Alle können über die Befehlszeilenargumente angegeben werden. Die Protokolldatei wird auch über die Befehlszeile angegeben.
Beachten Sie ein kleines gotcha, wenn Sie es mit dem Dämon verwenden, der in den Hintergrund verzweigt. Die Verwendung einer Pipe verhindert, dass der Dämon in den Hintergrund wechselt. In diesem Fall gibt es eine (wahrscheinlich bash-spezifische) Syntax, um das Problem zu vermeiden:
Beachten
<&0
Sie, dass es ohne diese scheinbar redundante Funktion nicht möglich ist.quelle