script

script

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.

unbufferDie Workarounds sind chaotisch, aber Sie sollten sich Befehle wie oder scriptoder 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 scriptkö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

verwandte Informationen