2010-03-26 5 views
5

Im écrire un script bash pour effectuer une sauvegarde hors site, en utilisant rsync sur SSH. Je suis en mesure d'envoyer STDOUT enregistreur, pour les journaux viaEnvoyer STDERR à l'enregistreur

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

Mais je veux envoyer STDERR, donc s'il y a un problème, comme celui hors site est indisponible, que la production doit être envoyée au enregistreur et connecté.

+0

Peut-être que vous voulez dire "à la fois stdout et stderr" pas "STDERR à la place". –

+0

en fait, je ne l'étais qu'après stderr, car il ne devrait pas générer de sortie. – Gnutt

Répondre

5

Si vous voulez stderr au lieu de stdout (plutôt que stderr et stdout), vous pouvez faire ce qui suit:

  1. ouvrir un autre descripteur de fichier (9)
  2. stdout de redirection (1) sur le nouveau descripteur de fichier (9)
  3. redirection stderr (2) à STDO ut (1)

Ce qui ressemble à ceci:

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

Alternativement, vous pouvez utiliser la substitution de processus:

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

Vous pouvez rediriger le descripteur STDERR (2) à STDOUT (1) en ajoutant 2>&1, par exemple:

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

C'est le 2> & 1 qui le fait. –

+0

@James à droite; éditer pour clarifier ce point –

2

Une autre façon d'assurer vos erreurs de script sont capturées ainsi que les erreurs rsync, est de faire quelque chose comme ceci:

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

Maintenant, toutes les données écrites dans stderr seront enregistrées, pas seulement celles de rsync. Cependant, ignorer stdout est généralement une mauvaise idée quand il s'agit de déboguer, car des informations utiles qui pourraient mettre en évidence la cause d'une erreur peuvent être enregistrées là. Si vous voulez faire la différence entre stderr et stdout, juste ne traverser les cours d'eau:

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

Pour fermer explicitement les poignées ou les restaurer, considérer les points suivants:

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

Pour les anciennes versions de bash, vous devrez peut-être être un peu plus émoussé:

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

Merci de m'avoir montré la construction n>> (dothis ...). – fbicknel