उपस्टार्ट के साथ एक डेमन का आउटपुट लॉग करना


34

मेरे पास एक कस्टम डेमॉन है जिसे मेरे उबंटू सर्वर पर अपस्टार्ट द्वारा प्रबंधित किया जाता है। यह पूरी तरह से काम करता है सिवाय इसके कि मुझे डेमन के आउटपुट को कैप्चर (लॉग) करना होगा। आधिकारिक पद पेज है कि मैं उपयोग कर सकते हैं का कहना है कि console loggedऐसा करने के लिए, लेकिन क्या फ़ाइल इसे करने के लिए लॉग इन करें करता है?

मैं भी पढ़ा है कि console loggedहै अब एक वैध छंद । मैं वर्तमान में 0.3.9 (हार्डी) का उपयोग कर रहा हूं, लेकिन कुछ महीनों में 0.6.x (ल्यूसिड) में अपग्रेड हो जाएगा। यदि console loggedवास्तव में बाद के संस्करणों के साथ काम नहीं करेगा, तो मैं इसके बजाय क्या उपयोग करूं?


1
क्या आप बस अपने कस्टम डेमॉन को अपडेट कर सकते हैं ताकि आउटपुट को syslog, या डेमन के कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट लॉगफ़ाइल में भेज सकें?
Zoredache

जवाबों:


35

यह स्निपेट आपकी सेवा के आउटपुट को लकड़हारा में बदल देगा, जबकि अभी भी आपको सेवा प्रक्रिया (इस प्रकार शेल प्रक्रिया को प्रतिस्थापित करने) को निष्पादित करने की अनुमति देता है ताकि अपस्टार्ट भ्रमित न हो। यह भी सुनिश्चित करता है कि लकड़हारा प्रक्रिया init के लिए पुन: प्रस्तुत की जाती है, इसलिए यह आपकी सेवा का बच्चा नहीं है, और यह फ़ाइल सिस्टम में बैठे हुए cruft को छोड़ने से बचता है, भले ही इसके लिए अस्थायी रूप से एक पेंडो बनाने की आवश्यकता हो।

script
  mkfifo /tmp/myservice-log-fifo
  ( logger -t myservice </tmp/myservice-log-fifo & )
  exec >/tmp/myservice-log-fifo
  rm /tmp/myservice-log-fifo
  exec myservice 2>/dev/null
end script

यहां देखिए यह कैसे काम करता है:

  1. mkfifo /tmp/myservice-log-fifoबस फेनो विशेष फ़ाइल (उर्फ नाम पाइप) बनाता है। man 7 fifoअधिक जानकारी के लिए टाइप करें ।
  2. ( logger ... </tmp/myservice-log-fifo & ) पृष्ठभूमि में, पानो से लकड़हारा पढ़ना शुरू करता है। वर्तमान शेल प्रक्रिया के एक बच्चे के बचे रहने के बजाए, लकड़हारा लकड़हारा प्रक्रिया का कारण बनता है।
  3. exec >/tmp/myservice-log-fifoवर्तमान शेल के स्टडआउट को पंद्रह पर पुनर्निर्देशित करता है। अब हमारे पास पंद्रो के लिए एक ओपन फाइल डिस्क्रिप्टर है, और हमें वास्तव में किसी भी अधिक फाइलसिस्टम प्रविष्टि की आवश्यकता नहीं है ...
  4. rm /tmp/myservice-log-fifo तो हम इसे हटा देंगे।
  5. exec myservice 2>/dev/nullबस सामान्य तरीके से सेवा चलाता है। स्टडआउट पहले से ही फोफो में जा रहा है, और जब नया प्रोग्राम निष्पादित होता है, तो यह नहीं बदलेगा।

अद्यतन: set -e की जरूरत नहीं है क्योंकि उपस्टार्ट डिफ़ॉल्ट रूप से इस विकल्प के साथ स्क्रिप्ट चलाता है (देखें http://upstart.ubuntu.com/cookbook/#develop-scripts-using-bin-sh )


महान जवाब, और कहीं भी आसपास पड़ी प्याज़ फ़ाइलों को नहीं छोड़ता।
राख बर्लिन-टेलर

क्या है set -e?
पीटर मूस

1
set -eयदि कोई आदेश विफल होता है तो स्क्रिप्ट तुरंत बाहर निकलने का कारण बनती है। उस पंक्ति के बिना, स्क्रिप्ट बाद के आदेशों को बेकार (और संभवतः खतरनाक रूप से) जारी रखेगा।
कीथ ररिक

1
Stderr के साथ-साथ stdout को लॉग करने के लिए, लाइन के exec 2>&1ऊपर लाइन जोड़ें rm, और 2>/dev/nullअंतिम लाइन से हटा दें ।
इसकी '11

31

हाल के Ubuntu संस्करणों (12.04+) के लिए, बस उपयोग करें

console log

और डेमॉन आउटपुट (STDOUT & STDERR) को जोड़ा जाएगा /var/log/upstart/<service>.log

http://upstart.ubuntu.com/cookbook/#console-log


2
यह साफ और अच्छा होगा, लेकिन दुर्भाग्य से यह CentOS 6.x पर काम नहीं करता है जो अभी भी अपस्टार्ट के एक प्राचीन संस्करण को शिप करता है जो इसका समर्थन नहीं करता है।
क्रिश्चियन मेघेरुएन-स्टैनसीउ

11

यदि आप console output श्लोक का उपयोग करते हैं , और फिर अपनी स्क्रिप्ट के आउटपुट logger(शेल कमांड इंटरफ़ेस को syslog (3) सिस्टम लॉग मॉड्यूल) पर पाइप करते हैं तो वह काम करेगा।

उदाहरण के लिए

console output
exec /my/script | logger

लॉग इन करेंगे /var/log/messages

उदाहरण के लिए

console output
exec /my/script | logger -t my-script

/var/log/messagesप्रत्येक संदेश के साथ लॉग इन और टैग करेगाmy-script

logger --help लकड़हारा उपयोग के विकल्प के लिए।

(मैं अमेज़ॅन लिनक्स एएमआई पर हूं, जो सेंटोस 5.x आधारित है; वाईएमएमवी)


4
यह पता चला है कि यह एक अच्छा समाधान नहीं है। अपस्टार्ट LID के PID पर लागू होता है logger, उस प्रक्रिया का नहीं, जिसे आप वास्तव में प्रबंधित करना चाहते हैं।
पीटर मून

10

मुझे mkfifoसंतोषजनक ढंग से काम करने की चाल नहीं मिली ; ऐसा लगता नहीं था कि स्टैडर पर कब्जा कर लिया गया था, और अपस्टार्ट को पुनर्निर्देशित करने का प्रयास बिना किसी त्रुटि के किया गया था।

यह भी loggerएक बच्चे के रूप में चारों ओर लटका प्रक्रिया बनाने का एक दुर्भाग्यपूर्ण पक्ष प्रभाव है init, इसलिए लकड़हारा "कौन" किसके पास है, इसके बारे में जानकारी खो गई है, और किसी को पहले से ही पता नहीं mkfifoहो सकता है कि यह एक झूलने वाली प्रक्रिया है जिसे मारा जा सकता है।

इसके बजाय मैं निम्नलिखित समाधान के साथ समाप्त हुआ, जो इन सभी मुद्दों को हल करता है। यह logger मूल प्रक्रिया के रूप में सेवा को संरक्षित करते हुए, एक बाल प्रक्रिया बन जाती है। दुर्भाग्य से, इसे निष्पादित करने की आवश्यकता है bash, लेकिन यह सिर्फ गंदा दिखता है।

script
  # ... setup commands here, e.g. environment, cd, ...
  exec bash <<EOT
    exec 1> >(logger -t myservice) 2>&1
    exec myservice
EOT
end script

यह एक ट्रिक का उपयोग करता है जो एक कमांड में stdout और stderr को रीडायरेक्ट करता है। चूँकि हम bashकमांड के अंदर सेवा को निष्पादित करते हैं , इसलिए शेल के स्थान पर इसका साइड इफेक्ट होता है और जादुई रूप से बैश सेवा की एक बाल प्रक्रिया बन जाती है, जैसा कि ps aufxwनिम्न द्वारा दिखाया गया है :

myservice 
 \_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
    \_ logger -t myservice

किसी कारण से उपरोक्त आदेश को एक में लपेटा जाना चाहिए bash -c। मुझे यह लगता है क्योंकि उपस्टार्ट केवल बैश के माध्यम से आपकी स्क्रिप्ट को चलाने का दिखावा करता है, लेकिन वास्तव में ऐसा नहीं है। अगर कोई अतिरिक्त बैश शेल से बचने का कोई तरीका सुझा सकता है, तो यह बहुत बढ़िया होगा।


1
हाँ! मुझे खुशी है कि मैंने यह पाया। Mkfifo वेरिएंट से बेहतर लगता है और मेरे मामले में मुझे exec bash -l << EOFवहाँ कोई नुकसान नहीं हुआ।
थोम_निक

6

यह बदसूरत है, लेकिन अब तक मुझे सबसे अच्छा मिला है

exec / path / to / server >> /tmp/upstart.log 2> & 1


2
लॉग रोटेशन की बात आती है तो समाधान अच्छा नहीं है, क्योंकि एप्लिकेशन सीधे फ़ाइल में प्रवेश कर रहा है। Syslog के माध्यम से लॉगिंग से संबंधित समस्याओं से बचा जाता है।
मार्क स्टोसबर्ग

3

आप आउटपुट को syslog, उदाहरण के लिए पुनर्निर्देशित भी कर सकते हैं

exec $SERVER 2>&1 | logger -t myservice -p local0.info

हालाँकि, पाइप लाइन ऊपर की ओर भटकने का कारण बन सकती है क्योंकि लॉगिंग प्रक्रिया के PID को डेमॉन के PID के साथ जोड़ा जाता है।


पीआईडी ​​को भ्रमित करने वाला डेमन वास्तव में एक बेकार डेमॉन है, क्योंकि यह प्रक्रिया को देखने के लिए माना जाता है, इसके बाद इसे देखें। यह सुनिश्चित करने के लिए कि सही PID को कैसे देखा जा रहा है?
जोहान फिलिप स्ट्रैटहॉसन

मुझे लगता है (लेकिन कोशिश नहीं की है) कि आप expect forkया expect daemonछंद चाहते हैं । या आप catलॉग संदेश में pid-file कर सकते हैं अन्यथा, मुझे लगता है।
पीटर मूस

1

एक अन्य विकल्प टी का उपयोग कर रहा है जैसे:

exec $SERVER 2>&1 | tee /dev/stderr | logger -t myservice

दोनों upstart फ़ाइल और syslog आउटपुट पाने के लिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.