2010-03-26 18 views
5

Estoy escribiendo un bash-script para realizar una copia de seguridad fuera del sitio, usando rsync sobre SSH. Soy capaz de enviar a STDOUT registrador, para los registros a través deEnviando STDERR al registrador

rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup | logger -i 

Pero quiero enviar STDERR lugar, por lo que si hay un problema, tal como el que fuera del sitio no está disponible, que la producción debe ser enviada a registrador y registrado.

+0

Quizás se refiera a "stdout y stderr" no "STDERR en su lugar". –

+0

en realidad solo estaba después de stderr, ya que de lo contrario no debería generar ninguna salida. – Gnutt

Respuesta

5

Si desea stderr en lugar de la salida estándar (en lugar de stderr y stdout), que puede hacer lo siguiente:

  1. abrir otro descriptor de archivo (9)
  2. redirección stdout (1) para el nuevo descriptor de archivo (9)
  3. redirección stderr (2) para STDO UT (1)

que se parece a esto:

rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup 9> /dev/null 1>&9 2>&1 | logger -i 

Alternativamente, se puede emplear proceso de sustitución:

logger -i <(rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup > /dev/null) 
6

Puede redirigir el descriptor STDERR (2) a la salida estándar (1) mediante la adición de 2>&1, por ejemplo:

rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup 2>&1 | logger -i 
+0

Son los 2> y 1 lo que lo hace. –

+0

@James derecha; edición para aclarar ese punto –

2

Otra forma de asegurar sus errores de script son capturados, así como los errores rsync, es hacer algo como esto:

#!/bin/bash 

set -eu 
set -o pipefail 

exec 1>/dev/null 2> >(logger -t "stderr-from-my-script") 

: do some interesting things 

rsync --del -az -e 'ssh -i mycrt.crt' /home/gnutt/backup/ [email protected]:backup 

: do some other interesting things 

Ahora, todos los datos escritos en stderr se registrarán, no solo los de rsync. Sin embargo, ignorar stdout suele ser una mala idea cuando se trata de depurar, ya que la información útil que podría resaltar la causa de un error podría registrarse ahí. Si desea diferenciar entre stderr y stdout, simplemente no cruzan las corrientes:

exec 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script") 

Para cerrar explícitamente las asas o restaurarlos, considere lo siguiente:

exec {OLD_STDOUT}>&1 {OLD_STDERR}>&2 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script") 

: Do some interesting things 

eval exec 1>&${OLD_STDOUT} 2>&${OLD_STDERR} ${OLD_STDOUT}>&- ${OLD_STDERR}>&- 

Para versiones anteriores de bash, puede que tenga que ser un poco más contundente:

exec 3>&1 4>&2 1> >(logger -t "stdout-from-my-script") 2> >(logger -t "stderr-from-my-script") 

: Do some interesting things 

exec 1>&3 2>&4 3>&- 4>&- 
+0

Gracias por mostrarme la construcción n>> (dothis ...). – fbicknel

Cuestiones relacionadas