"Warum Rohre manchmal "stecken... Notiz

"Warum Rohre manchmal "stecken bleiben": Pufferung"

"Pufferung ist in Terminal-Programmen üblich, um die Leistung durch Gruppierung von Ausgaben bis zu einer bestimmten Größe zu verbessern. Dies kann Probleme verursachen, wenn Daten langsam einem Pipe hinzugefügt werden, da Programme ihre Ausgaben puffern und nie schreiben.Grep und ähnliche Programme verwenden standardmäßig Block-Pufferung, wenn sie in Pipes schreiben, aber Zeilen-Pufferung, wenn sie in Terminals schreiben, was erklärt, warum der Befehl "tail -f /some/log/file | grep thing1 | grep thing2" möglicherweise keine Ausgabe anzeigt.Einige Befehle puffern ihre Ausgaben, darunter grep, sed, awk, tcpdump und jq, während Befehle wie tail, cat und tee keine Pufferung verwenden.Programmiersprachen wie C, Python, Ruby und Perl können auch ihre Ausgaben puffern, mit verschiedenen Methoden, um die Pufferung zu deaktivieren.Wenn Strg+C auf einer Pipe gedrückt wird, kann der Ausgabenpuffer eines Programms verloren gehen, da das Signal vor dem Fluschen des Puffers empfangen wird.Pufferung tritt auch auf, wenn auf eine Datei umgeleitet wird, aber sie verhält sich im Allgemeinen wie erwartet, mit dem Inhalt des Puffers, der vor dem Programm-Exit geschrieben wird.Um die Pufferung zu vermeiden, kann man ein Programm ausführen, das schnell beendet wird, den "--line-buffered"-Flag mit grep verwenden, den Befehl mit awk neu schreiben, stdbuf verwenden oder unbuffer verwenden, um das Programm zu zwingen, sich so zu verhalten, als würde es in ein Terminal schreiben.Die ideale Lösung hängt von der spezifischen Situation ab, wobei unbuffer eine zuverlässige Wahl für sein konsistentes Verhalten ist.Während Pufferung im Allgemeinen kein häufiges Problem ist, kann sie auftreten, wenn Daten langsam einem Pipe hinzugefügt werden. Eine Umgebungsvariable, um die Pufferung zu deaktivieren, könnte nützlich sein, aber ihr Design und ihre Implementierung stellen Herausforderungen dar."