Para algunas máquinas en la nube que estoy iniciando, estoy tratando de iniciar sesión en un archivo específico, syslog y el terminal / consola.
En la parte superior de los scripts de configuración de mi máquina / inicio de nube, tengo lo siguiente:
#!/bin/bash
exec &> >(tee "/tmp/box-setup.log" | logger -t box-setup)
apt-get install -y some-package
Esto funciona muy bien al enviar la salida a un archivo y syslog, pero no se canaliza a la salida al terminal.
En general, no tener salida de terminal no es un gran problema, excepto cuando estoy depurando desde una consola remota. Cuando eso sucede, estoy completamente ciego porque la consola está en blanco mientras se ejecuta el script bash.
¿Hay una manera simple de utilizar la bash
redirección o lo que sea para canalizar toda la salida (salida estándar junto con error estándar) a un archivo, syslog y el terminal simultáneamente?
Estoy ejecutando Ubuntu 16.04.
fuente
exec &> >(tee /tmp/box-setup.log >(logger -t box-setup))
Es posible que desee resolver ese problema de una manera diferente: ejecute su script bash en segundo plano, y ejecute
less /tmp/box-setup.log
y presione F para seguir actualizando la pantalla a medida que se agregan líneas al archivo que está mirando (comotail -f
).Si ejecutar el script en segundo plano es un problema, use
tmux
oscreen
para obtener múltiples sesiones multiplexadas en una conexión ssh. Use el mismoless
comando en otro shell.El problema original:
tee
Puede copiar a múltiples destinos. Convierta uno de ellos en terminal, utilizando el/dev/tty
archivo especial. Creo que siempre se refiere al control del proceso actual. O probablemente mejor,/dev/stderr
ya quetee
el stderr todavía está conectado al stderr del shell. (Esto le permite silenciar el script con &> / dev / null).Por cierto, esto es equivalente pero más eficiente que
(tee /dev/stderr | tee "/tmp/box-setup.log" | logger ...)
.Sería posible usar algo de clonación de descriptores de archivo para proporcionar
tee
el stdout del script original, en lugar de stderr.fuente
Simplemente agregue
/dev/stderr
(su elección) como salida atee
.La salida estándar y el error estándar se fusionarán. No hay forma de mantenerlos separados si desea preservar su orden, lo que generalmente es deseable. No importa si ambos van al mismo lugar (por ejemplo, la terminal) de todos modos.
fuente
tee
La salida estándar es la tubería al registrador, no la terminal. Esstderr
en ese punto que sigue siendo el terminal, basado enexec &> >(tee /dev/stderr > /dev/null)
trabajar como se esperaba en un shell interactivo.stderr
parece una mejor idea que mi/dev/tty
idea, ya que te permite cerrar fácilmente el script con una redirección si lo deseas.