[यह सीधे सिस्टमड-टैम्पाइल के मुद्दे को संबोधित नहीं करता है लेकिन मुझे लगता है कि आप पहले से ही पहचान चुके हैं कि इस विशेष मामले में आप केवल इको का उपयोग करके बेहतर हैं।]
सबसे पहले, "multi-user.target" वह हो सकता है या नहीं जो आप उपयोग करना चाहते हैं। यदि आप SysV स्टाइल इनिट स्टफ से रनलेवल्स की अवधारणा से परिचित हैं, तो मल्टी-यूज़र रनलेवल 3 के बराबर सिस्टम है, जो एक मल्टी-यूज़र सिस्टम है जो कंसोल पर बूट होता है, GUI नहीं। रनलेवल 5 के बराबर, जो एक्स के लिए बूट होता है, ग्राफिकल.टार्ग है । डिफ़ॉल्ट में एक सिमलिंक से निर्धारित होता है /etc/systemd/system
(और / या /lib/systemd/system
; में एक /etc
में एक निष्प्रभावी होगा /lib
) कहा जाता default.target , उपयोग ls जहां यह कहते हैं खोजने के लिए:
»ls -l /etc/systemd/system/default.target
default.target -> /usr/lib/systemd/system/multi-user.target
सामान्य लिनक्स डेस्कटॉप के लिए यह ग्राफिकल होगा। टारगेट। यह वास्तव में महत्वपूर्ण नहीं है यदि आप चाहते हैं कि आप जो बूट सेवा शुरू कर रहे हैं वह डिफ़ॉल्ट रनलेवल / लक्ष्य की परवाह किए बिना शुरू हो - उस स्थिति में, हम बस default.target का उपयोग कर सकते हैं, और चिंता न करें कि यह किस लिए एक उपनाम है। यदि आप बहु-उपयोगकर्ता का उपयोग करते हैं, हालांकि, और आपका डिफ़ॉल्ट चित्रमय है, तो आपकी सेवा नहीं होगी।
सेवा के आधार पर, अधिक उपयुक्त और विशिष्ट लक्ष्य या सेवाएं हो सकती हैं, जिनके संबंध में आप इसे शुरू करना चाहते हैं। आपके अन्य प्रश्न के आधार पर, default.target शायद ठीक है। एक नोट के रूप में, एक "लक्ष्य" और एक "सेवा" के बीच का अंतर यह है कि एक सेवा में एक [Service]
अनुभाग होता है जो वास्तव में एक प्रक्रिया चलाता है; एक लक्ष्य विभिन्न "निर्भर करता है" और "निर्देशों की आवश्यकता" के माध्यम से एक साथ सेवाओं को समूहीकृत करने का एक तरीका है; यह अन्य लक्ष्यों या सेवाओं को ट्रिगर करने से परे खुद का कुछ भी नहीं करता है।
जब कोई सेवा शुरू होती है, तो यह निर्धारित किया जाता है कि अन्य सेवाएँ किस पर निर्भर हैं। इस तरह की एक साधारण, स्टैंड-अलोन घटना के मामले में, जिसे हम बूट प्रक्रिया में देरी से चलाना चाहते हैं, हम निर्देशन के इस संयोजन का उपयोग कर सकते हैं:
[Unit]
After=default.target
[Install]
WantedBy=default.target
सेवा स्थापित होने पर "इंस्टॉल" अनुभाग का उपयोग किया जाता है; "वांटेडबी" एक लक्ष्य को निर्दिष्ट करता है जिसे हम चाहते हैं कि इस सेवा को शामिल किया जाए (जिसका अर्थ है कि अगर यह लक्ष्य चलता है, लेकिन nb। यह निर्धारित नहीं करता है कि यह दूसरों के संबंध में कब चलेगा )। चूंकि हम वास्तव में चाहते हैं कि यह सेवा बाद में जल्द से जल्द चले, इसलिए हम "बाद" खंड निर्दिष्ट करते हैं। यह वास्तव में वांटेडबी लक्ष्य के समान होने की आवश्यकता नहीं है (यह आमतौर पर नहीं है) और पूरी तरह से छोड़ा जा सकता है यदि आप परवाह नहीं करते हैं जब ऐसा होता है; मैं बस इसे कूबड़ पर उपयोग कर रहा हूं कि सामान के संबंध में अधिकांश अन्य सामान चलाए जाएंगे जो कहीं न कहीं उस चीज के लिए जंजीर है Before=default.target
जो निर्दिष्ट है (जिसे हम भी इस्तेमाल कर सकते थे; लक्ष्य के चलने से पहले एक लक्ष्य की चाहत को मूल्यांकित किया जाता है)।
उदाहरण के लिए, मैं सांत्वना के लिए "हैलो वर्ल्ड" प्रतिध्वनित करूंगा। सेवा स्वयं [Service]
अनुभाग में वर्णित है :
[Service]
Type=forking
ExecStart=/usr/local/bin/helloworld
कमांड को एक पूर्ण पथ की आवश्यकता है। मेरे द्वारा उपयोग नहीं किए जाने का कारण /usr/bin/echo "hello world"
यह है कि यह काम नहीं करेगा (आउटपुट / dev / null में जाता है, मुझे लगता है), और एक सेवा जो एक echo "hello world" > /dev/console
वसीयत करता है , प्रयोग दर्शाता है कि एक ExecStart निर्देश में शेल पुनर्निर्देशन का उपयोग नहीं किया जाएगा । इसलिए / usr / लोकल / बिन / हेलोवर्ल्ड उस एक लाइन के साथ एक शेल स्क्रिप्ट है echo "hello world" > /dev/console
।
नोट करें Type=forking
, जो शेल स्क्रिप्ट के लिए आवश्यक है।
हमारा पूरा, कम से कम सेवा फ़ाइल सिर्फ उन तीन वर्गों है ( [Unit]
, [Service]
, और [Install]
)। स्थापित करने के लिए, फ़ाइल या एक सिमिलिंक को उसमें / etc / systemd / system या / usr / lib / systemd / system, और:
systemctl --system enable helloworld
इसे छापना चाहिए ln -s ...
। यह सेवा को चलाता नहीं है, यह सिर्फ बूट पर चलाने के लिए कॉन्फ़िगर करता है जैसा कि ऊपर चर्चा की गई है।
यह संक्षेप में है। man systemd.unit
और man systemd.service
अधिक विवरण है।