Ausgabe umleiten mit tee

A

aloisius

Jungspund
Hallo,
ich möchte eine Programmausgabe auf dem SDTOUT und in eine log Datei haben.
Mit

tuwas | tee -a logdatei
klappt das im Prinzip.

Aber:

Die Ausgabe auf den STDOUT wird durch die pipe nach tee offenbar gepuffert.
d.h. man erält während des Programmablaufes keine Augaben sondern alles auf einen Rutsch nach Programmende.

Mann mir da jemand weiterhelfen ?
 
Sicher, dass das Programm nicht auch puffert?
Ansonsten versuch's mal mit
Code:
tuwas >> logdatei & tail -f logdatei
 
Eben...es kommt ganz darauf an was das Programm macht...ob es die Ausgabe "on Block" nach stdout schreibt oder halt Zeile für Zeile...
Um was für ein Programm handelt es sich denn..bzw. wenn es ein Shellskript ist einfach mal posten :D
 
nähere erklärung

Hallo,

das Program puffert nicht.

wenn ich
tuwas
aufrufe werden nach und nach ausgaben auf den Bildschirm geschrieben.
Es ist ein C Programm, ich aber keinen quellcode dazu.
 
das mit tail würd glaub ich nur dann funktionieren, wenn das c programm selbst in den file schreiben würde und die pufferung vorher abschaltet. so aber schreibt das c programm in die console und die shell lenkt die daten in die datei um. der shell kann man meines wissens nicht beibringen das block buffering bei ausgabe in datei oder pipe zu unterlassen.
 
Ich weiss es nicht, doch vermute ich, dass das System anders puffert, wenn die Ausgabe in eine Datei umgeleitet wird (es ist ja i.d.R. nicht das Programm, das puffert, sondern das System), und da koennte tail ja was bringen. Wenn nicht, koennte man ja ein sync alle sekunde aufrufen:
Code:
#!/bin/bash
while(true)
do
   sync;
   sleep 1;
done
Das sieht jedoch ein wenig nach overkill aus...
 
Hallo

rikola schrieb:
Ich weiss es nicht, doch vermute ich, dass das System anders puffert, wenn die Ausgabe in eine Datei umgeleitet wird (es ist ja i.d.R. nicht das Programm, das puffert, sondern das System), und da koennte tail ja was bringen. Wenn nicht, koennte man ja ein sync alle sekunde aufrufen:
Code:
#!/bin/bash
while(true)
do
   sync;
   sleep 1;
done
Das sieht jedoch ein wenig nach overkill aus...

Das ist allerdings mehr als overkill. ;)

Also folgendes funktioniert mit tee völlig wie erwartet.
Hier wird nämlich Zeilenweise ausgegeben.
Das ist aber im Falle @aloisius Aufgabe seines Programmes, dafür zu sorgen.

Code:
for i in $(seq 100); do echo $(date +"%H_%M_%S")|tee +a "teedatei";sleep 1; done
geht genauso wie
Code:
for i in $(seq 100); do echo $(date +"%H_%M_%S");sleep 1; done|tee +a "teedatei"
Es ist allerdings schon Sache des Programmes, ob gepuffert ausgegeben wird oder nicht.
Sonst würde nämlich das Entpuffern für Perl auch nicht gehen.
Code:
local $| = 1;

Gruß Wolfgang
 
Ja...also ich habe auch rein vom Gefühl her auch eher den Verdacht, dass das verwendete C-Programm da rein spuckt...
 

Ähnliche Themen

Welches Linux/Unix für ehemaligen OSX Nutzer?

String auf Konsole ausgeben

Ausgabe in Datei umleiten und gleichzeigig eine max. Größe der Datei definieren?

Alle Ausgaben eines Shellscripts umleiten ohne Pipe

stderr in stdout und Datei leiten

Zurück
Oben