सरल बनाम सिस्टमिंग?


25

मैं अपनी पहली systemdइकाई फ़ाइल लिख रहा हूँ ।

के लिए Type, कुछ विकल्प हैं: forking, simple, आदि मैंने पढ़ा है Redhat प्रलेखन इस विषय (तालिका 9.9) पर, लेकिन अभी भी यकीन है कि जब मैं कौन-सा विकल्प का उपयोग करना चाहिए नहीं कर रहा हूँ।

कोई दिशा निर्देश?

जवाबों:


48

जब आप सेवा को मैन्युअल रूप से कमांड लाइन से शुरू करते हैं (बिना nohupउपसर्ग कमांड या &प्रत्यय के इसे पृष्ठभूमि में चलाने के लिए, या दूसरे शब्दों में, बस उस कमांड को चलाएं जिसे आप फ़ाइल की ExecStart=लाइन पर .serviceडालेंगे), क्या होता है?

a) यदि सेवा शुरू होती है और चलती रहती है, और जब तक आप Control-C नहीं दबाते हैं या कुछ अन्य तरीके से सेवा को बंद नहीं करते हैं, तब तक वापस नहीं आता है: तो Type = simpleसही विकल्प है।

b) अगर प्रॉम्प्ट लौटता है, लेकिन सर्विस बैकग्राउंड में चलती रहती है (यानी सर्विस अपने आप ही डिमॉनेटाइज हो जाती है), तो Type = forkingसही विकल्प है।

ग) यदि सेवा अपना काम करती है और बिना कुछ चलाए ही प्रॉम्प्ट पर वापस लौटती है (अर्थात सेवा केवल कुछ कर्नेल सेटिंग्स को समायोजित करती है, किसी अन्य चीज़ को कमांड भेजती है या ऐसा ही कुछ करती है), तो Type = oneshotशायद सही विकल्प है। इस मामले में, ExecStartसेवा कुछ "सेट" करने के लिए कमांड हो सकती है, और ExecStopइसे "अनसेट" करने के लिए संबंधित कमांड होगी। इस प्रकार का आमतौर पर लाभ होता है RemainAfterExit=true, इसलिए सिस्टमड इस सेवा की "स्थिति" पर नज़र रखेगा, चाहे वह चीज हाल ही में "सेट" या "परेशान" हो।

अन्य Typeमान विशेष मामले हैं। उदाहरण के लिए, यदि सेवा डी-बस कनेक्शन का उपयोग करती है, तो Type = dbusसबसे अच्छा विकल्प हो सकता है। यह systemdइस तथ्य से अवगत कराता है, और फिर डी-बस में इस सेवा की उपस्थिति से सिस्टमड इस सेवा (और उस पर निर्भर कुछ भी) को ट्रैक करेगा।

उपयोग करने के लिए Type = notify, प्रक्रिया को पर्यावरण चर में निर्दिष्ट यूनिक्स सॉकेट से कनेक्ट करने $NOTIFY_SOCKETऔर उस सॉकेट के लिए संदेश लिखकर अपनी स्थिति की रिपोर्ट करने में सक्षम होना चाहिए । साथ ही, सेवा फ़ाइल NotifyAccessको उचित रूप में अधिसूचना सॉकेट तक पहुंच प्रदान करने का विकल्प निर्दिष्ट करना चाहिए ।

एक कमांड-लाइन उपयोगिता systemd-notifyऔर एक सी लाइब्रेरी फ़ंक्शन है जिसका sd_notify(3)उपयोग आप इन संदेशों को भेजने के लिए कर सकते हैं, लेकिन यदि उनमें से कोई भी आपकी आवश्यकताओं के लिए उपयुक्त नहीं है, तो आप बस अपना संदेश भेजने वाले को लागू कर सकते हैं। आवश्यक संदेश बहुत सरल हैं, और शेल चर असाइनमेंट जैसे दिखते हैं: उदाहरण के लिए, यह सूचित करने के लिए कि सेवा सफलतापूर्वक स्टार्टअप पूरी कर चुकी है और किसी भी आने वाले अनुरोधों को पूरा करने के लिए तैयार है, सेवा को printf "READY=1\n"सॉकेट के आउटपुट के बराबर स्ट्रिंग भेजना चाहिए । man 3 sd_notifyमान्यता प्राप्त संदेशों पर अधिक जानकारी के लिए देखें ।

नोट: डिफ़ॉल्ट रूप से कई यूनिक्स-शैली प्रणालियों के लिए पोर्टेबल होने के लिए डिज़ाइन किए गए कई सेवा एप्लिकेशन b) के रूप में व्यवहार कर सकते हैं, लेकिन एक विकल्प की तरह जोड़कर काम किया जा सकता है) (आमतौर पर "कांटा नहीं" के रूप में वर्णित है, "चालू रखें) अग्रभूमि में "," डोनेमाइज़ न करें "या समान)। उस स्थिति में, यदि विकल्प का कोई अन्य दुष्प्रभाव नहीं है, तो विकल्प को जोड़ना और एक) का उपयोग करके व्यवहार के लिए बेहतर होगा systemd


मान लीजिए मैं शुरू करता हूं apache, किस प्रकार का उपयोग किया जाना चाहिए?
किटीगर्ल

2
खैर, आप इसे मैन्युअल रूप से कैसे शुरू करेंगे? apachectl startजड़ के रूप में चलने से, शायद? इसे करने की कोशिश करें, और देखें कि क्या होता है। फिर मेरे उत्तर से a), b) या c) उठाओ। मैं शर्त लगाता हूं कि शीघ्र रिटर्न और अपाचे चल रहे हैं, इसलिए बी) जवाब होगा।
टेल्कोएम

मुझे वास्तव में आपके उत्तर में दिए गए स्पष्टीकरण पसंद हैं। क्या आप इस मामले के लिए एक और सादे अंग्रेजी स्पष्टीकरण जोड़ना चाहेंगे Type=notify?
यांकी

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