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?

Benjamin
quelle
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
Goldlöckchen
quelle
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)
c2h2
quelle
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.

Hennes
quelle