Wie führe ich einen Befehl aus, während ich die Ausgabe in einer Datei protokolliere?


7

Ich habe eine Konsolenanwendung, die im Rahmen der Bereitstellung einer neuen Anwendungsversion auf meinem Server ausgeführt werden muss.

Diese Konsolenanwendung ist für die Ausgabe auf der Konsole vorgesehen und kann nicht geändert werden.

Ich möchte es wie gewohnt ausführen, habe aber stdout und stderr in einer Datei protokolliert, während sie gleichzeitig an die Konsole ausgegeben werden.

Wie kann ich das unter Linux machen?


1
Suche nach tee, viele Antworten.
Matt

1
Eine andere Möglichkeit wäre: script -a the_logfile #und dann die Apps in der 'Skript'-Umgebung ausführen, die auch Sonderzeichen, Strg-Codes usw. protokolliert und verwendet werden kann, um die Anzeige "wiederzugeben", wenn Sie es schaffen, sie ordnungsgemäß zu verwenden. dh gerade das Protokoll aus der gleichen Art von Terminal und usnig die gleichen Zeilen / Spalten, und mit einem „mehr“ oder „kleinen“ , dass Ausgängen Zeichen Kontrolle (ex: more -v the_logfile)
Olivier Dulac

Ist dies eine Anwendung, die einen Textstrom druckt, oder eine Vollbild-Textmodusanwendung?
Gilles 'SO - hör auf böse zu sein'

@ Gilles Nur ein Textstrom!
Benjamin

Antworten:


7

Sie können verwenden tee. Zum Beispiel:

ls -l / | tee tmp.txt

Druckt nach Standard und tmp.txtenthält eine Kopie der Ausgabe. Wenn Sie stderr in tmp.txt aufnehmen möchten:

ls -l / 2>&1 | tee tmp.txt

Vielen Dank, habe es gerade versucht, aber es sieht so aus, als würde nur stdout protokolliert. Ist es möglich, auch stderr zu protokollieren?
Benjamin

@ Benjamin Das sollte sein cmd 2>&1 | tee .... Ich habe dies in bearbeitet.
Goldlöckchen

Danke, 2>&1funktioniert gut!
Benjamin

10

Sie können tee http://en.wikipedia.org/wiki/Tee_(command) verwenden.

Nur stdout leiten

cmd | tee log.txt | less

So leiten Sie sowohl stdout als auch stderr weiter:

cmd >>(tee stdout.log) 2>>(tee stderr.log >&2)

1
Sollte das > >sein >>?
Supr

Vielen Dank. Ich werde jedoch die Antwort von @ goldilocks bevorzugen, da ich sowohl stdout als auch stderr in derselben Datei haben möchte, so wie ich sie auf der Konsole sehen würde!
Benjamin

3

Es gibt verschiedene Möglichkeiten, dies zu tun.

  1. nohup 2>&1 application &. Dadurch werden alle Ausgaben an eine Datei namens nohup.out gesendet. Es werden auch SIGHUPs erfasst. Sie können die Shell also schließen und sie läuft weiter. Wenn Sie sehen möchten, was passiert, können Sie die Ausgabe mit verfolgen tail -f nohop.out.
  2. Der teeBefehl macht dasselbe, ohne SIGHUP zu verhindern. C2h und Goldlöckchen erwähnen dies bereits.
  3. Wenn Sie nur einen eingeschränkten Bildlauf benötigen, versuchen Sie es screen -L. Dies wird in diesem Beitrag näher erläutert .

Mir ist klar, dass der Bildschirm eine Problemumgehung ist, aber die anderen Funktionen sind für Bereitstellungen sehr hilfreich.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.