2010-03-26 16 views
5

पर STDERR भेजना मैं एसएसएच पर rsync का उपयोग करके ऑफसाइट बैकअप करने के लिए बैश-स्क्रिप्ट लिख रहा हूं। मैंलॉगर

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

के माध्यम से, लकड़हारा को STDOUT भेजने के लिए लॉग के लिए कर सकती हूं लेकिन मैं बजाय STDERR भेजना चाहते हैं, तो अगर वहाँ एक समस्या है, जैसे कि ऑफसाइट के रूप में उपलब्ध नहीं है, कि उत्पादन के लिए भेजा जाना चाहिए लॉगर और लॉग इन

+0

शायद आपका मतलब है "दोनों stdout और stderr" बजाय "STDERR" नहीं। –

+0

वास्तव में मैं केवल stderr के बाद था, क्योंकि यह अन्यथा कोई आउटपुट उत्पन्न नहीं करना चाहिए। – Gnutt

उत्तर

5

आप stdout की (बल्कि stderr और stdout से) stderr बजाय चाहते हैं, आप कर सकते हैं निम्नलिखित:

  1. अन्य फ़ाइल वर्णनकर्ता (9)
  2. रीडायरेक्ट stdout खोलने (1) नई फ़ाइल वर्णनकर्ता के लिए (9)
  3. रीडायरेक्ट stderr (2) stdo को केन्द्र शासित प्रदेशों (1)

इस तरह दिखता है कौन सा:

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

वैकल्पिक रूप से, आप इस प्रक्रिया के प्रतिस्थापन को रोजगार दे सकता है:

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

आप 2>&1 जोड़ने, उदाहरण के लिए द्वारा STDOUT (1) के लिए STDERR वर्णनकर्ता (2) अनुप्रेषित कर सकते हैं:

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

यह 2> और 1 है जो यह करता है। –

+0

@ जेम्स सही; उस बिंदु को स्पष्ट करने के लिए संपादन –

2

एक अपनी स्क्रिप्ट त्रुटियों को सुनिश्चित करने के अन्य तरीके के साथ ही कब्जा कर लिया है rsync त्रुटियों, ऐसा कुछ करने के लिए है:

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

अब, stderr को लिखा गया सभी डेटा लॉग इन होगा, न कि rsync से। हालांकि, stdout को अनदेखा करना आम तौर पर एक खराब विचार है जब यह डिबगिंग की बात आती है, क्योंकि उपयोगी जानकारी जो किसी त्रुटि के कारण को हाइलाइट कर सकती है वहां लॉग किया जा सकता है। आप stderr और stdout के बीच अंतर करना चाहते हैं, बस पार नहीं करते धाराओं:

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

स्पष्ट रूप से हैंडल बंद करने या उन्हें पुनर्स्थापित करने के लिए निम्न पर विचार करें:

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

पुराने संस्करणों के लिए बाश के, आपको थोड़ा और अधिक धक्का होना पड़ सकता है:

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

मुझे n>> (doesis ...) निर्माण दिखाने के लिए धन्यवाद। – fbicknel

संबंधित मुद्दे