Ich habe ein Bash-Skript, das ausgeführt wird, solange der Linux-Computer eingeschaltet ist. Ich starte es wie unten gezeigt:
( /mnt/apps/start.sh 2>&1 | tee /tmp/nginx/debug_log.log ) &
Nach dem Start kann ich den Befehl tee in meiner ps- Ausgabe wie folgt sehen:
$ ps | grep tee
418 root 0:02 tee /tmp/nginx/debug_log.log
3557 root 0:00 grep tee
Ich habe eine Funktion, die die Größe des Protokolls überwacht, das tee erzeugt und den tee- Befehl beendet, wenn das Protokoll eine bestimmte Größe erreicht:
monitor_debug_log_size() {
## Monitor the file size of the debug log to make sure it does not get too big
while true; do
cecho r "CHECKING DEBUG LOG SIZE... "
debugLogSizeBytes=$(stat -c%s "/tmp/nginx/debug_log.log")
cecho r "DEBUG LOG SIZE: $debugLogSizeBytes"
if [ $((debugLogSizeBytes)) -gt 100000 ]; then
cecho r "DEBUG LOG HAS GROWN TO LARGE... "
sleep 3
#rm -rf /tmp/nginx/debug_log.log 1>/dev/null 2>/dev/null
kill -9 `pgrep -f tee`
fi
sleep 30
done
}
Zu meiner Überraschung wird das Beenden des tee- Befehls auch durch die start.sh-Instanz beendet. Warum ist das? Wie kann ich den tee- Befehl beenden, aber meine start.sh weiterhin ausführen? Vielen Dank.
tee -a
for verwendentee
, um die Datei im Anhänge-Modus zu öffnen. Andernfalls schreibt tee nach dem Abschneiden weiterhin mit demselben Versatz in die Datei (und auf Systemen, die keine Sparse-Dateien unterstützen, wie dies unter macOS der Fall ist) Ordnen Sie den Abschnitt der Datei, der zu dieser Position führt, neu zu (und nehmen Sie dabei doppelt so viel Speicherplatz ein).logger -s
zu senden, damit Syslog sich um die Protokollierung kümmert (-s
um auch auf stderr zu drucken).logrotate
. Tolles ProgrammDas "Warum" erklären
Kurz gesagt: Wenn schreibt failing nicht tat Ursache ein Programm zu beenden (Standard), würden wir ein Chaos haben. Bedenken
find . | head -n 10
Sie - Sie möchten nichtfind
weiterlaufen und den Rest Ihrer Festplatte scannen, nachdem Siehead
bereits die 10 benötigten Zeilen belegt und fortgefahren haben.Besser machen: Drehen Sie in Ihrem Logger
Betrachten Sie Folgendes, das
tee
als anschauliches Beispiel überhaupt nicht verwendet wird :Wenn ausgeführt als:
... dies beginnt mit dem Anhängen an
/tmp/nginx/debug_log
und dem Umbenennen der Datei in,/tmp/nginx/debug_log.old
wenn mehr als 100 KB Inhalt vorhanden sind. Da der Logger selbst die Rotation durchführt, gibt es keine unterbrochene Pipe, keinen Fehler und kein Datenverlustfenster, wenn die Rotation stattfindet - jede Zeile wird in die eine oder andere Datei geschrieben.Natürlich ist die Implementierung in nativer Bash ineffizient, aber das Obige ist ein anschauliches Beispiel. Es stehen zahlreiche Programme zur Verfügung, die die obige Logik für Sie implementieren. Erwägen:
svlogd
, der Service-Logger aus der Runit-Suite.s6-log
, eine aktiv gewartete Alternative aus der Skanet-Suite.multilog
von DJB Daemontools, dem Urvater dieser Familie von Prozessüberwachungs- und Überwachungswerkzeugen.quelle