मैंने एक कस्टम एप्लिकेशन के लिए एक सरल सिस्टमड सर्विस फ़ाइल बनाई है। जब मैं इसे मैन्युअल रूप से चलाता हूं तो एप्लिकेशन अच्छी तरह से काम करता है, लेकिन जब मैं इसे सिस्टमड के साथ चलाता हूं तो मेरा सीपीयू अधिकतम हो जाता है।
मैं यह जानने की कोशिश कर रहा हूं कि मेरी समस्या कहां है, लेकिन मुझे नहीं पता कि आउटपुट कहां मिलेगा (या आउटपुट को कहीं और डालने के लिए सिस्टम को कैसे कॉन्फ़िगर करें)।
यहाँ मेरी सेवा फ़ाइल है:
[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/messagesचाल है। समस्या यह है कि लॉग के अनुसार, मेरा डेमॉन शुरू होने पर दुर्घटनाग्रस्त हो जाता है, फिर भी मैं बता सकता हूं कि यह अभी भी चल रहा है क्योंकि इसमें एक HTTP सर्वर है, और मैं इसे क्वेरी कर सकता हूं। ऐसा लगता है कि बाकी लॉग खो गए हैं ...
StandardOutput=ttyकरने का प्रयास क्यों न करें ताकि आप देख सकें कि आपके डेमॉन को लॉन्च करते समय क्या हो रहा है। यह टर्मिनल को आउटपुट करना चाहिए (आपको ttyS0अपनी स्क्रीन पर आउटपुट प्राप्त करने के लिए उपयोग या समान करना पड़ सकता है )।
ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
/var/log/syslogआउटपुट के लिए जाँच करने की कोशिश की है? अधिकांश सिस्टम सामान को लॉग इन करेंगे,/var/log/इसलिए मैं वहाँ जाँच करके शुरू करूँगा। आपgrepपाठ के लिए खोज करने के लिए उपयोग कर सकते हैं यदि आप आउटपुट जानते हैं:grep "my output" /var/logचाल करना चाहिए।