Was ich anzeigen muss, ist ein Protokoll, das regelmäßig aktualisiert wird. Es ist ein Block mit etwa 10 Textzeilen. Ich verwende |tee und es funktioniert gerade. Die Leistung ist jedoch weniger zufriedenstellend. Es wartet eine Weile und gibt dann mehrere Textblöcke aus mehreren Aktualisierungen aus (insbesondere wenn das Programm gerade gestartet wird, dauert es ziemlich lange, bis etwas auf der Konsole angezeigt wird, und als ich dies zum ersten Mal sah, dachte ich, das Programm würde hängen). Außerdem bricht es zufällig in der Mitte des letzten Blocks ab, sodass die Darstellung ziemlich hässlich ist.
Gibt es eine Möglichkeit, dies zu verbessern? (Vielleicht jedes Mal weniger ausgeben und häufiger zwischen Ausgabedatei und Konsole wechseln?)
Aktualisieren: Folgendes steht derzeit in meinem Bash-Skript:
tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log
Antwort1
Ich denke, Ihr Problem ist auf eine grundlegende Eigenschaft von Pipes zurückzuführen, nämlich die Pufferung.
unbuffer
Die Workarounds sind chaotisch, aber Sie sollten sich Befehle wie oder script
oder ansehen stdbuf
.
Vielleicht etwas, um die Ausgabepufferung durch Tee wie folgt zu stoppen:
your_program | stdbuf -o0 tee
PS: Ich sitze gerade nicht an einer Konsole und kann das daher nicht ausprobieren.
Antwort2
Ich verwende eine Befehlsgruppierung und leite die Ausgabe in eine Prozesssubstitution um. Darin gebe ich sie an /dev/tty und an stdout weiter. Dann leite ich stdout und stderr in eine Datei um. Funktioniert für mich bisher. Sie können der Ausgabe problemlos einen Zeitstempel und eine Prozesskennung voranstellen, wenn Sie möchten.
{
#script goes here
} > >(while read TEXT ; do MESSAGE="$(date +"%d.%m.%Y") $(date +"%Hh%Mm%Ss") $LOGPREFIX $TEXT"; echo $MESSAGE; echo $MESSAGE > /dev/tty; done >> $LOGFILE) 2>&1
Antwort3
script
Laufen
$ script -c "your_program" result.log
anstatt
$ your_program | tee result.log
z.B script -c "ls" result.log
.
Übrigens: Mit script
können Sie ganze Bash-Sitzungen aufzeichnen, die Sie mit einem Befehl starten
script result.log
und beenden
exit
.
Diese Antwort wurde bereits von @curious_cat eingefügt und ist die gleiche Antwort auf diese Frage:Aufzeichnen einer Bash-Sitzung