Ich versuche, ein funktionierendes System zum Überwachen spezieller Protokolle zu erhalten. Normalerweise möchte ich nur ein sehr spezifisches Muster, das ich mit grep
und einer Pipe extrahiere tail -f
. Mir ist aufgefallen, dass grep nicht alles ausgibt, sondern einige Zeilen zwischenspeichert. Ich denke, das macht Sinn, wenn Sie eine Pipe haben, die alles ausgibt und dann beendet und den Stream schließt.
Aber damit tail -f
klappt es bei mir nicht.
Dasselbe Problem tritt bei auf sed
.
Hier ist ein Beispielbefehl, den ich verwenden möchte:
clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g | grep -E --color 'ssh-iptables-perma|$'
Ein Beispiel:
Die letzte Zeile des obigen Befehls lautet:
2015-05-04 11:17:24,551 [ssh-iptables] Ban x.x.x.x
Und mit diesem Befehl:
clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g
Die letzte Zeile ist diese:
2015-05-04 19:45:17,615 [ssh-iptables] Ban y.y.y.y
Durch das Entfernen weiterer Pipes gelange ich zu den aktuellsten Einträgen.
Wie kann ich dieses Caching in den Pipes möglicherweise vermeiden?
Antwort1
Fügen Sie grep
die Option von --line-buffered
und sed
die Option von hinzu --unbuffered
.
Antwort2
Verwenden Sie grep
die --line-buffered
Option .
Standardmäßig verwenden Dienstprogramme Zeilenpufferung, wenn ihre Standardausgabe ein Terminal ist, verwenden aber größere Puffer (wahrscheinlich 4 oder 8 KB), wenn ihre Ausgabe mit einem Dateideskriptor oder einer Pipe verbunden ist.
Sie haben Glück, dass tail -F
standardmäßig Zeilenpufferung verwendet wird und grep
es eine Befehlszeilenoption gibt, um dies zu aktivieren. Mir ist keine allgemeine Methode bekannt, um Zeilenpufferung für einen beliebigen Befehl zu aktivieren.