Bei einigen Cloud-Computern, die ich starte, versuche ich, mich bei einer bestimmten Datei, einem bestimmten Syslog und dem Terminal / der Konsole anzumelden.
Am Anfang meiner Maschinen-Setup- / Cloud-Init-Skripte habe ich Folgendes:
#!/bin/bash
exec &> >(tee "/tmp/box-setup.log" | logger -t box-setup)
apt-get install -y some-package
Dies funktioniert hervorragend beim Senden von Ausgaben an eine Datei und ein Syslog, leitet jedoch keine Weiterleitungen an das Terminal weiter.
Im Allgemeinen ist es kein großes Problem, keine Terminalausgabe zu haben, außer wenn ich von einer Remote-Konsole aus debugge. In diesem Fall bin ich völlig blind, da die Konsole während der Ausführung des Bash-Skripts leer ist.
Gibt es eine einfache Möglichkeit, die bash
Umleitung oder was auch immer zu verwenden, um alle Ausgaben (Standardausgabe zusammen mit Standardfehler) gleichzeitig an eine Datei, ein Syslog und das Terminal zu leiten?
Ich verwende Ubuntu 16.04.
quelle
exec &> >(tee /tmp/box-setup.log >(logger -t box-setup))
Möglicherweise möchten Sie dieses Problem auf eine andere Weise lösen: Führen Sie Ihr Bash-Skript im Hintergrund aus und führen Sie
less /tmp/box-setup.log
F aus, um den Bildschirm weiter zu aktualisieren, während der angezeigten Datei Zeilen hinzugefügt werden (wietail -f
).Wenn das Ausführen des Skripts im Hintergrund ein Problem darstellt, verwenden Sie
tmux
oderscreen
, um mehrere Sitzungen auf eine SSH-Verbindung zu multiplexen. Verwenden Sie denselbenless
Befehl in einer anderen Shell.Das ursprüngliche Problem:
tee
kann an mehrere Ziele kopieren. Machen Sie eines davon mit der/dev/tty
speziellen Datei zum Terminal . Ich denke, es bezieht sich immer auf die Kontrolle des aktuellen Prozesses. Oder wahrscheinlich besser,/dev/stderr
datee
's stderr immer noch mit dem stderr der Shell verbunden ist. (Auf diese Weise können Sie das Skript mit &> / dev / null zum Schweigen bringen.)Übrigens ist dies gleichbedeutend mit aber effizienter als
(tee /dev/stderr | tee "/tmp/box-setup.log" | logger ...)
.Es wäre möglich, ein Dateideskriptor-Klonen zu verwenden, um
tee
das stdout des ursprünglichen Skripts anstelle von stderr anzugeben.quelle
Fügen Sie einfach
/dev/stderr
(Ihre Wahl) als Ausgabe hinzutee
.Standardausgabe und Standardfehler werden zusammengeführt. Es gibt keine Möglichkeit, sie getrennt zu halten, wenn Sie ihre Reihenfolge beibehalten möchten, was normalerweise wünschenswert ist. Es spielt keine Rolle, ob beide sowieso zum selben Ort (z. B. zum Terminal) gehen.
quelle
tee
's stdout ist die Pipe zum Logger, nicht das Terminal. Es iststderr
zu diesem Zeitpunkt immer noch das Terminal, basierend aufexec &> >(tee /dev/stderr > /dev/null)
der erwarteten Arbeit in einer interaktiven Shell.stderr
scheint eine bessere Idee zu sein als meine/dev/tty
Idee, da Sie damit das Skript einfach mit einer Umleitung schließen können, wenn Sie möchten.