30s Laufzeitunterschied zw. tail -> mounted file vs. echo -> mounted file

suados_forum

Active Member
Ich habe auf meinem Host einen gemounteten Ordner. Jetzt schreibe per echo in die Datei fileonhost etwas rein.
Wenn ich ein tail -c +1 -f fileonhost | tee 2&1 | > /mnt/fileonserver laufen lasse, wird der Eintrag in fileonhost sofort geschrieben aber der Eintrag in fileonserver erscheint erst ca. 30 Sekunden später - obwohl er mittels tail schon angezeigt wird!

Schreibe ich aber per echo in die Datei fileonserver wird dies sofort in die Datei geschrieben!

Warum bzw. was ist falsch???
 
Zuletzt bearbeitet:
Irgendjemand buffert da. tee buffert nicht und ist für gewöhnlich auch kein Buildin. Daher wird es das Redirect | > sein. Das | an der Stelle ist überflüssig und könnte dir, je nach Shell, Probleme machen. Probier es mal ohne. :)
 
Bei tail -f fileonhost >> /mnt/fileonserver schiebt jede neue Änderung der fileonhost die vorhergehende(n) Änderung weiter - die letzte Änderung fließt dann nach ca. 30 Sekunden!

Bei tail -f fileonhost > /mnt/fileonserver werden alle Änderungen ca. 30 Sekunden nach Eintreffen weitergereicht!

Wie kann ich ihm sagen, dass er ohne Puffer arbeiten soll?
 
Hast du mal versucht, das Problem lokal nachzustellen? Also ohne dass du auf einem externen Mountpoint arbeitest?

Rob
 
@KobRheTilla hat vollkommen recht, ein externer Mountpoint kann da mit reinspielen.

Wie kann ich ihm sagen, dass er ohne Puffer arbeiten soll?
Pipes und Buffer sind ein jahrzehntelanges Ärgernis, so alt wie Pipe unter Unix selbst. Das Problem ist, dass unter Unix Dateien (in Standardeinstellung) immer einen Buffer nutzen. stdin, stdout und stderr sind Dateien, also haben sie den Buffer. Welche Form von Buffer hängt etwas vom zugrundeliegenden System ab. Neuere Unix-Implementierungen sind meist schlau genug bei der Ausgabe auf ein Terminal einen Line Buffer zu verwenden und sonst einen Block Buffer. Der einzige Weg den Buffer in einer Pipe loszuwerden ist, dass die beteiligten Programme auf ihrem stdout bzw. stdin per setvbuf()-Aufruf das Buffering abschalten. Machen Teile deiner Pipe (oder im Falle von Redirections die Shell) das nicht, hast du verloren.

Kluge Menschen haben sich irgendwann einmal einen etwas dreckigen Hack ausgedacht: Simpel gesagt hat man ein kleines Programm, welches auf seinem Prozess stdin, stdout und stderr per setvbuf() anpasst und sich danach per execv selbst überschreibt. Dabei bleibt die Buffer-Einstellung erhalten und man kann sie externen Programm unterschieben. Linux und FreeBSD liefern dafür stdbuf mit, es implementiert genau den Hack. OpenBSD scheint es nicht zu tun, aber vielleicht gibt es Alternativen. Da müsste aber ein OpenBSDler was zu sagen.
 
Ich verstehe jetzt garnichts mehr. Habe mich jetzt mal mit tail an den Dateien langgehangelt um zu schauen, wann er was einträgt:

Schaue ich von dem Host aus mit tail -f fileonserver auf die gemountet Datei ist der Eintrag sofort vorhanden.
Schaue ich von dem Server auf seine eigene Datei mit tail -f fileonserver erscheine er erst die besagten 30s später!

Wie kann das denn sein? Ist doch die selbe Datei !?
 
Habe eine Lösung: mount -o sync

Auszug aus der manpage für mount:

Code:
...
     -o options
         ...
         sync       Regular data I/O to the file system should be done
                    synchronously.  By default, only metadata is
                    read/written synchronously.
...
 
Zurück
Oben