Ich habe einen Batch-Prozess mit langer Laufzeit, der einige Debug- und Prozessinformationen an stdout ausgibt. Wenn ich nur von einem Terminal aus laufe, kann ich verfolgen, wo es ist, aber dann werden die Daten zu groß und rollen vom Bildschirm.
Wenn ich zur Ausgabe in eine Datei '> out.txt' umleitung, erhalte ich die gesamte Ausgabe, sie ist jedoch gepuffert, sodass ich nicht mehr sehen kann, was sie gerade tut.
Gibt es eine Möglichkeit, die Ausgabe umzuleiten, aber die Schreibvorgänge nicht zu puffern?
Antworten:
Sie können die Pufferungsoptionen der Standard-Streams explizit mithilfe eines
setvbuf
Aufrufs in C festlegen (siehe diesen Link ). Wenn Sie jedoch versuchen, das Verhalten eines vorhandenen Programms zu ändern, versuchen Sie esstdbuf
(dies istcoreutils
anscheinend Teil des Starts mit Version 7.5).Dies puffert
stdout
bis zu einer Zeile:Dies deaktiviert die
stdout
Pufferung insgesamt:quelle
./configure && make
. Sie müssen es nicht einmal nachträglich installieren, sondern können einfach diestdbuf
Binärdatei off verwendensrc/
.Sie können eine zeilengepufferte Ausgabe in eine Datei erzielen, indem Sie den folgenden
script
Befehl verwenden:quelle
batch_process
wenn Sie&
den obigen Befehl anhängen , zumindest auf meiner Linux-Box), wie es scheint wie ein extrem häufiger Anwendungsfall, und b) es gibt hier keine Erklärung dafür, wie diese Beschwörung funktioniert.Unter Ubuntu hat das
unbuffer
Programm (aus demexpect-dev
) Paket den Trick für mich gemacht. Renn einfach:unbuffer your_command
und es wird es nicht puffern.
quelle
Die einfachste Lösung, die ich gefunden habe (es mussten keine Pakete von Drittanbietern installiert sein), wurde in einem ähnlichen Thread auf der Unix- und Linux- Site erwähnt: Verwenden Sie den
script
Befehl. Es ist alt und wahrscheinlich bereits installiert.Beachten Sie, dass der erste Dateinamenparameter für den
script
Befehl die zu schreibende Protokolldatei ist . Wenn Sie einfach ausführenscript -q your_command
, überschreiben Sie den Befehl, den Sie eingerückt haben, um ihn mit der Protokolldatei auszuführen. Überprüfen Sieman script
dies aus Sicherheitsgründen, bevor Sie es versuchen.quelle
versuche den
script
Befehl; Wenn Ihr System über einen Dateinamen verfügt, wird der gesamte in stdout abgelegte Text in die Datei kopiert. Dies ist sehr nützlich, wenn ein Setup-Programm eine Interaktion erfordert.quelle
Persönlich bevorzuge ich die Weiterleitung der Ausgabe eines Befehls, den ich untersuchen möchte
tee
.script
zeichnet zu viele Informationen auf, einschließlich des Zeitpunkts für das Drücken von Tasten, und viele nicht druckbare Zeichen. Wastee
spart, ist für mich viel lesbarer.quelle
tee
die Pufferung auch davon betroffen ist. Beim Aufteilen der Ausgabe vonfind
Befehlen werden häufig noch Teilzeilen durch tee angezeigt .Leiten Sie die Ausgabe in eine Datei um und folgen Sie der Datei mit dem
tail -f
Befehl.Bearbeiten
Wenn dies immer noch unter Pufferung leidet, verwenden Sie die Syslog-Funktion (die im Allgemeinen nicht gepuffert ist). Wenn der Batch-Prozess als Shell-Skript ausgeführt wird, können Sie dazu den Befehl logger verwenden. Wenn der Batch-Job in einer Skriptsprache ausgeführt wird, sollte es trotzdem eine Protokollierungsfunktion geben.
quelle
This answer is useful
Antworten, die nicht funktionieren und möglicherweise nicht funktionieren können?Sie können den
tee
Befehl verwenden, nur Magie!someCommand | tee logFile.log
wird sowohl in der Konsole angezeigt als auch in die Protokolldatei geschrieben.quelle
tee
verhindert keine Pufferung.tee
vermeidet es nicht, etwas zu puffern, sondern ermöglicht Ihnen nur, einen Blick auf die Ausgabe zu werfen. Dies ist, was @JamesDean wollte (wie ich seine Frage verstanden habe), aber ich denke, Pufferung ist hier nicht wirklich das Problem. Wenn Sie weitere Informationen haben, lassen Sie es mich wissen.tee
die Ausgabe zu verwenden, die man nicht bekommt, um eine bessere Ansicht zu bekommen?>
Sie nichts auf der Konsole. Ich denke, @JamesDean benutzt das Wort "buffering", um das zu beschreiben. Ich werde einen Kommentar zu seiner Frage posten, damit er mehr darüber sagt, was er will.