जब आप सेवा को मैन्युअल रूप से कमांड लाइन से शुरू करते हैं (बिना 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
, किस प्रकार का उपयोग किया जाना चाहिए?