2010-03-26 13 views
5

Sto scrivendo un bash-script per eseguire un backup offsite, utilizzando rsync su SSH. Sono in grado di inviare STDOUT al logger, per i log viaInvio di STDERR al logger

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

Ma voglio inviare STDERR invece, quindi se c'è un problema, come quello fuori sede non è disponibile, che l'uscita deve essere inviato a logger e loggato.

+0

Forse vuoi dire "sia stdout che stderr" non "STDERR invece". –

+0

in realtà ero solo dopo stderr, dal momento che non dovrebbe altrimenti generare alcun output. – Gnutt

risposta

5

Se volete stderr invece di stdout (invece di stderr e stdout), si può fare il seguente:

  1. aprire un altro descrittore di file (9)
  2. reindirizzamento stdout (1) per il nuovo descrittore di file (9)
  3. reindirizzamento stderr (2) per stdo ut (1)

che assomiglia a questo:

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

In alternativa, si potrebbe impiegare sostituzione di processo:

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

È possibile reindirizzare il descrittore STDERR (2) a STDOUT (1) con l'aggiunta di 2>&1, ad esempio:

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

È il 2> & 1 che lo fa. –

+0

@James right; modifica per chiarire quel punto –

2

Un altro modo per garantire i vostri errori di script vengono catturati così come gli errori rsync, è di fare qualcosa di simile:

#!/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 

Ora, tutti i dati scritti su stderr verranno registrati, non solo quelli da rsync. Tuttavia, ignorare stdout è in genere una cattiva idea quando si tratta di eseguire il debug, poiché è possibile che vengano registrate informazioni utili che potrebbero evidenziare la causa di un errore. Se si vuole distinguere tra stderr e stdout, basta non attraversare i torrenti:

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

Per chiudere in modo esplicito le maniglie o il ripristino, considerare quanto segue:

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}>&- 

Per le versioni più vecchie di bash, potresti dover essere un po 'più schietto:

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

Grazie per avermi mostrato il n>> (dothis ...) costrutto. – fbicknel

Problemi correlati