सिस्टमड सर्विस का स्टडआउट / स्टॉडर देखें


175

मैंने एक कस्टम एप्लिकेशन के लिए एक सरल सिस्टमड सर्विस फ़ाइल बनाई है। जब मैं इसे मैन्युअल रूप से चलाता हूं तो एप्लिकेशन अच्छी तरह से काम करता है, लेकिन जब मैं इसे सिस्टमड के साथ चलाता हूं तो मेरा सीपीयू अधिकतम हो जाता है।

मैं यह जानने की कोशिश कर रहा हूं कि मेरी समस्या कहां है, लेकिन मुझे नहीं पता कि आउटपुट कहां मिलेगा (या आउटपुट को कहीं और डालने के लिए सिस्टम को कैसे कॉन्फ़िगर करें)।

यहाँ मेरी सेवा फ़ाइल है:

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target

आवेदन भर में, मैं stdout और stderr के लिए उत्पादन।

मैं अपने डेमन के आउटपुट को कैसे पढ़ सकता हूं?

संपादित करें:

मैंने पाया man systemd.exec, जिसने StandardOutput=विकल्प का उल्लेख किया है, लेकिन मुझे यकीन नहीं है कि इसका उपयोग कैसे किया जाए। से आदमी पेज :

StandardOutput=

नियंत्रण जहां निष्पादित प्रक्रियाओं की फ़ाइल डिस्क्रिप्टर 1 (STDOUT) से जुड़ा है। विरासत , अशक्त , tty , syslog , kmsg , kmsg + कंसोल , syslog + कंसोल या सॉकेट में से एक लेता है ।

यदि मानक इनपुट के फ़ाइल डिस्क्रिप्टर को इनहेरिट करने के लिए सेट किया गया है तो मानक आउटपुट के लिए डुप्लिकेट किया गया है। यदि शून्य मानक आउटपुट से कनेक्ट किया जाएगा /dev/null, तो यह लिखा हुआ सब कुछ खो जाएगा। यदि tty मानक आउटपुट पर सेट किया जाता है तो tty से जुड़ा होगा (जैसा TTYPath=कि नीचे दिया गया है, नीचे देखें)। यदि TTY का उपयोग आउटपुट के लिए किया जाता है तो केवल निष्पादित प्रक्रिया टर्मिनल की नियंत्रण प्रक्रिया नहीं बनेगी, और टर्मिनल को जारी करने के लिए अन्य प्रक्रियाओं के लिए विफल या प्रतीक्षा नहीं करेगी। syslog मानक आउटपुट को syslog (3) सिस्टम लकड़हारे से जोड़ता है। kmsg इसे कर्नेल लॉग बफर से जोड़ता है जो dmesg (1) के माध्यम से सुलभ है। syslog + कंसोल और kmsg + कंसोलइसी तरह काम करते हैं, लेकिन आउटपुट को सिस्टम कंसोल पर भी कॉपी करते हैं। सॉकेट मानक आउटपुट को सॉकेट सक्रियण से सॉकेट से जोड़ता है, शब्दार्थ संबंधित विकल्प के समान है StandardInput=। यह सेटिंग इनहेरिट करने के लिए चूक करता है।

क्या इसका मतलब यह है कि ये मेरे एकमात्र विकल्प हैं? मैं उदाहरण के लिए, /dev/shmकुछ या कुछ में आउटपुट डालना चाहूंगा । मुझे लगता है कि मैं एक यूनिक्स डोमेन सॉकेट का उपयोग कर सकता हूं और एक साधारण श्रोता लिख ​​सकता हूं, लेकिन यह थोड़ा अनावश्यक लगता है।

मुझे बस डिबगिंग के लिए इसकी आवश्यकता है, और मैं संभवतः अधिकांश लॉग को हटाकर आउटपुट को सिस्लॉग में बदल दूंगा।


क्या आपने /var/log/syslogआउटपुट के लिए जाँच करने की कोशिश की है? अधिकांश सिस्टम सामान को लॉग इन करेंगे, /var/log/इसलिए मैं वहाँ जाँच करके शुरू करूँगा। आप grepपाठ के लिए खोज करने के लिए उपयोग कर सकते हैं यदि आप आउटपुट जानते हैं: grep "my output" /var/logचाल करना चाहिए।
sbtkd85

@ sbtkd85 - ठीक है, मेरे पास नहीं है /var/log/syslog, लेकिन /var/log/messagesचाल है। समस्या यह है कि लॉग के अनुसार, मेरा डेमॉन शुरू होने पर दुर्घटनाग्रस्त हो जाता है, फिर भी मैं बता सकता हूं कि यह अभी भी चल रहा है क्योंकि इसमें एक HTTP सर्वर है, और मैं इसे क्वेरी कर सकता हूं। ऐसा लगता है कि बाकी लॉग खो गए हैं ...
पीटा

सेट StandardOutput=ttyकरने का प्रयास क्यों न करें ताकि आप देख सकें कि आपके डेमॉन को लॉन्च करते समय क्या हो रहा है। यह टर्मिनल को आउटपुट करना चाहिए (आपको ttyS0अपनी स्क्रीन पर आउटपुट प्राप्त करने के लिए उपयोग या समान करना पड़ सकता है )।
sbtkd85

3
मानक IO पुनर्निर्देशन ऑपरेटरों को इस संदर्भ में काम नहीं करना चाहिए। कुछ इस तरहExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
दीपक मित्तल

वास्तव में आपके CPU का दुरुपयोग क्या है? क्या यह सिस्टमड, आपकी सेवा या प्रणाली है (उदाहरण के लिए सर्विस की नई प्रतियां पैदा करना क्योंकि सिस्टमड पागल हो गया है)?
पीटर ने

जवाबों:


183

अपडेट करें

मीकेमेकाना नोट के रूप में, सिस्टमड जर्नल अब सबसे अधिक विकृतियों के लिए मानक लॉगिंग डिवाइस है। एक systemd इकाई के देखने के लिए stdoutऔर कमांड काstderr उपयोग करें journalctl

sudo journalctl -u [unit]

मूल उत्तर

डिफ़ॉल्ट रूप से stdoutऔर stderrएक systemd इकाई को syslog में भेजा जाता है।

यदि आप पूर्ण सिस्टमड का उपयोग कर रहे हैं, तो इसके माध्यम से पहुंच होगी journalctl। फेडोरा पर, यह होना चाहिए /var/log/messagesलेकिन syslog इसे डाल देगा जहां आपके नियम कहते हैं।

पोस्ट की तिथि, और अधिकांश लोग systemd के संपर्क में हैं कि फेडोरा के माध्यम से, तो आप शायद बग यहाँ वर्णित ने टक्कर मार दी रहे थे कर रहे हैं संभालने के कारण: https://bugzilla.redhat.com/show_bug.cgi?id=754938 यह है यह कैसे काम करता है इसकी एक अच्छी व्याख्या =) (यह सेलिनक्स-नीति में एक बग था जिसके कारण त्रुटि संदेश लॉग नहीं हो सकते थे, और इसमें ठीक हो गए थे selinux-policy-3.10.0-58.fc16)


5
ध्यान दें कि इस तरह मानक लॉगिंग तंत्र का उपयोग करना डिफ़ॉल्ट रूप से लगातार लॉग नहीं बनाएगा। ऐसा करने के लिए, आपको / var / log / journal बनाना होगा, और फिर रन करना होगाsudo systemctl restart systemd-journald
mlissner

1
क्या syslog सुविधा और प्राथमिकता?
jwwren

2
इसने मेरे लिए काम किया: StandardOutput=syslog+consoleऔर StandardError=syslog+consoleउसके बाद मेरी यूनिट से सभी आउटपुट जर्नलैक्ट में दिखाई दिए। डिफ़ॉल्ट सेटिंग स्पष्ट रूप से गलत थी। (जैसे कि DefaultStandardOutput in /etc/systemd/system.conf)
gregn3

2
-fमेरे लिए मददगार था। परिवर्तन के रूप में लॉग का अनुसरण किया (उपयोग मामला minecraft सर्वर जो एक डेमन के रूप में चल रहा था) का अनुसरण कर रहा था
ब्लाउज

2
यह मुझे पागल कर रहा है ... एक मानक डेबियन स्ट्रेच पर मुझे कोई भी मानक आउटपुट दिखाई नहीं देगा। मैं भी उपयोग /usr/bin/stdbuf -oL <cmd>और एक स्पष्ट StandardOutput=journal। अब तक कुछ भी नहीं।
jlh

81

छोटा, सरल, गैर-विरासत उत्तर:

sudo journalctl -u [unitfile]

जहाँ [Unitfile] सिस्टमड .serviceनाम है। जैसे, संदेश देखने के लिए myapp.service,

sudo journalctl --unit=myapp

वास्तविक समय में लॉग का पालन करने के लिए:

sudo journalctl -f -u myapp

4
ध्यान दें कि sudoयदि आपको कोई No journal files foundत्रुटि मिलती है तो आपको हो सकता है ।
बिगजॉश

5
syslog विरासत नहीं है ...
माइल्स राउत

2
यह वर्तमान लिनक्स डिस्ट्रोस में है। आप वास्तव में syslog को पसंद कर सकते हैं, लेकिन यह नहीं बदलता है कि वे किसके साथ जहाज करते हैं।
मिकमेकाना

1
ज़रूर। और यह भी syslog का उपयोग करता है। मेरा कहना यह नहीं था कि सिस्टीडी का उपयोग नहीं किया जाता है, लेकिन यह सिसलॉग विरासत नहीं है।
भूलभुलैया

6
@JECompton यदि वर्तमान लिनक्स डिस्ट्रोस पर सभी लॉगिंग जर्नल का उपयोग करता है, और syslog आवश्यक नहीं है और केवल संगतता के लिए उपयोग किया जाता है, तो यह तार्किक रूप से अनुसरण करता है कि syslog विरासत है।
मिकमेकाना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.