2013-09-02 4 views
5

मैं अपनी स्क्रिप्ट में -s (यानी मूक) विकल्प को लागू करने की कोशिश कर रहा हूं - जब त्रुटियां/जानकारी इत्यादि दी जाती है, तो अन्यथा प्रिंटिंग syslog को भेजी जाएगी स्क्रीन पर और एक ही समय में syslog पर भेजना। यही कारण है कि मैं क्या कर रहा है:स्क्रीन पर प्रिंटिंग संदेश और एक ही समय में syslog को भेजें

echo -e "This Is a Test Message\nWell, not really!!" 2>&1 | logger 

syslog को echo संदेश (जो परदे पर मुद्रित नहीं करता है) लेकिन कितना ही समय में दोनों करने के लिए समझ नहीं सकता है भेजने के लिए। मैं लोगों को केवल syslog के साथ लॉगिंग करने के बारे में बात करता हूं या स्क्रीन पर प्रिंटिंग करते समय अलग फ़ाइल पर लॉग भेज रहा हूं, लेकिन जिस स्थिति में मैं कोशिश कर रहा हूं, उस स्थिति में नहीं। किसी भी मदद या सूचक की सराहना की जाएगी। चीयर्स !!

+0

आप 'tee' पर पाइप कर सकते हैं:' ... | tee -a/var/log/syslog' – hek2mgl

+2

'tee -a/var/log/syslog' का उपयोग न करें - केवल रूट ही ऐसा कर सकता है, और syslogd उस फ़ाइल में बस जोड़ने के अलावा सभी प्रकार के वैकल्पिक हैंडलिंग कर सकता है। –

+0

@ hek2mgl: सच है, लेकिन वह फ़ाइल सिस्टम से सिस्टम में भिन्न होती है; जैसे Red Hat आधारित सिस्टम के लिए '/ var/log/messages'। 'लॉगर' का उपयोग सुरक्षित आईएमओ है। चीयर्स !! – MacUsers

उत्तर

4

आप syslog में और stdout (नहीं stderr) के लिए संदेश भेजना चाहते हैं, तो आप भी ऐसा कर सकते हैं:

echo -e "This Is a Test Message\nWell, not really!!" | tee >(exec logger) 

और कारगर तरीका यह करने के लिए (यदि आप एक समारोह बना रहे हैं) :

exec 40> >(exec logger) 

function log { 
    echo -e "$1" 
    echo -e "$1" >&40 
} 

log "something..." 

exec 40>&- ## optionally close it at the end of the script. 

इससे आपकी स्क्रिप्ट को हर बार जब आप एक गूंज करते हैं तो बाहरी बाइनरी लॉगर को कॉल करने से बचाएंगे।

+0

आप फ़ंक्शन को कैसे कॉल करते हैं? – Juto

+0

@ कंसोलबॉक्स: मुझे लगता है कि यह मेरे लिए जाने का तरीका है। इसलिए, बस मैक सुनिश्चित करने के लिए, अगर मैं कस्टम फ़ाइल डिस्क्रिप्टर का उपयोग करता हूं, तो 'echo' दो बार उपयोग करने के अलावा इसे करने का कोई तरीका नहीं है? चीयर्स !! – MacUsers

+0

@Juto : आप समारोह को कॉल करने के तरीके से कॉल करते हैं: 'लॉग "कुछ प्रिंट करें ..." '। * लॉग * फ़ंक्शन का नाम है। – MacUsers

0

आप कर सकते हैं:

echo -e "This Is a Test Message\nWell, not really!!" | logger -s 

मैनुअल पृष्ठ (आदमी लकड़हारा) राज्यों:

-s  Log the message to standard error, as well as the system log. 
+0

पहले से ही '-s' की कोशिश की लेकिन यह तथ्य पसंद नहीं आया कि यह उपयोगकर्ता नाम के साथ संदेश उपसर्ग करता है:' admin: यह एक टेस्ट है ... "। यह नई लाइन के लिए \ n' को भी संभाल नहीं सकता है, जो मेरे लिए अच्छा नहीं है। चीयर्स !! – MacUsers

+0

मैंने 2> और 1 हटा दिया क्योंकि यह अनिवार्य रूप से अनिवार्य है - इस पर ध्यान दिए बिना कि इसका विकल्प उपयोग किया गया है या नहीं। –

1

उस मामले में, केवल दो बार एक ही संदेश गूंज। आप कर सकते हैं:

echo -e "This Is a Test Message\nWell, not really!!" | tee /dev/stderr | logger 

लेकिन, यह वास्तव में सरल और अधिक कुशल करना है:

error='This Is a Test Message\nWell, not really!!' 
echo -e "$error" >&2 
echo -e "$error" | logger 

> & 2 उत्पादन stderr करने के लिए है, न कि stdout से भेजता है।

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