आप बूट पर अंतिम सेवा के रूप में एक सिस्टमड सेवा कैसे बनाते हैं?


26

कई साल पहले, हम अपनी स्टार्टअप-स्क्रिप्ट में लिख सकते हैं /etc/rc.local। सभी सिस्टम सेवाओं को लोड करने के बाद, आपकी स्क्रिप्ट चलेगी।

अब, हम systemd का उपयोग करते हैं, हमारे पास rc.localअब और नहीं है। Systemd समानांतर सेवा शुरू करता है। आप एक rc.local` कार्य करने के लिए अपनी स्वयं की सेवा लिख ​​सकते हैं, लेकिन आप यह सुनिश्चित नहीं कर सकते हैं कि यह सभी सिस्टम सेवाओं के लोड होने के बाद चलेगा।

क्या इसे करने का कोई तरीका है? या हमें उपयोग करना है Beforeऔर Afterसिस्टमड सर्विस फ़ाइल में?



5
सिस्टर्ड, अपस्टार्ट नहीं !!
46 比尔

नाम और संस्करण OS निर्दिष्ट करें?
STTR

OS: आर्क लिनक्स, संस्करण: N / A
''

1
@ @ Know क्यों "अंतिम", क्या आप स्क्रिप्ट की निर्भरता नहीं जानते हैं, या क्या आप चाहते हैं कि यह सुरक्षित रहे?
पॉल

जवाबों:


27

सिस्टमड में यह सलाह दी जाती है कि आप अपनी सेवाओं का उपयोग करें Before=और After=अन्य लोगों के आसपास अच्छी तरह से ऑर्डर करें।

लेकिन जब से आपने उपयोग किए बिना रास्ता पूछा Beforeऔर After, आप उपयोग कर सकते हैं:

Type=idle

जो man systemd.serviceबताते हैं:

के व्यवहार के idleसमान है simple; हालाँकि, सेवा कार्यक्रम के वास्तविक निष्पादन में देरी हो जाती है जब तक कि सभी सक्रिय नौकरियों को भेज नहीं दिया जाता है। यह कंसोल पर स्थिति आउटपुट के साथ शेल सेवाओं के आउटपुट के इंटरलेविंग से बचने के लिए उपयोग किया जा सकता है। ध्यान दें कि यह प्रकार केवल कंसोल आउटपुट को बेहतर बनाने के लिए उपयोगी है, यह सामान्य यूनिट ऑर्डर करने वाले टूल के रूप में उपयोगी नहीं है, और इस सेवा प्रकार का प्रभाव 5 एस टाइमआउट के अधीन है, जिसके बाद सेवा कार्यक्रम वैसे भी लागू होता है।


1
नमस्ते, यदि आप पहले या बाद में उपयोग करने वाले थे तो क्या आप सिंटैक्स को विस्तृत करना चाहेंगे?
r4ccoon

कुछ अलग विषय है, लेकिन अगर कोई उपयोगकर्ता प्रक्रियाओं को सिस्टम प्रक्रियाओं से अलग चलाना चाहता है, तो वहां पूछें गई हैububuntu.com/a/859583/457417
बेन क्रीसी

बूट प्रक्रिया के अंत में सेट /proc/sys/kernel/modules_disabledकरने के लिए पूरी तरह से काम किया1
स्टुअर्ट कार्डॉल

0

यह वास्तव में "बूटेड" की आपकी परिभाषा पर निर्भर करता है। मुझे लगता है कि आप चाहते हैं कि यह गेट्टी शुरू होने के तुरंत बाद चले। ऐसा करने के लिए, आपको अपनी सेवा को /etc/systemd/system/getty.target.wants/निर्देशिका में जोड़ना होगा । आपको यह भी सुनिश्चित करना चाहिए कि आपकी फ़ाइल इस निर्देशिका में अन्य सेवाओं के समान कोड का उपयोग कर रही है। बूटअप और शटडाउन पर एक कस्टम सेवा चलाने के लिए (बस मेरे मदरबोर्ड बज़र को बीप करता है) मैं निम्नलिखित स्क्रिप्ट का उपयोग करता हूं/etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh निष्पादन योग्य है और इसमें शुरुआत में एक शेबंग है।

ध्यान दें कि बूट में इस बिंदु पर सब कुछ शुरू नहीं किया जाएगा, लेकिन यह वह बिंदु है जिस पर लॉगऑन प्रॉम्प्ट उपयोगकर्ता को दिखाई देता है

यद्यपि यह उपयोग करता है Before=और After=, यह मेरे लिए बहुत अधिक समझ में आता है और वास्तव में काम करता है; मुझे उपर्युक्त उत्तर की जानकारी पर्याप्त नहीं मिली। यह भी है कि आप का उपयोग करने के लिए दोनों की अनुमति देता है ExecStart=और ExecStop=, बजाय एक करने के लिए सीमित किया जा रहा Type=simpleतरह सेवा।


-2

मैं बारीकियों या आर्चलिनक्स से परिचित नहीं हूं, लेकिन यहां सामान्य रूप से सिस्टमैड का प्रबंधन कैसे किया जाता है।

खैर, मूल रूप से systemd /etc/init.d/ में स्क्रिप्ट का एक संग्रह है, जो /etc/rcX.d, जहां X रन स्तर की संख्या है, से सहानुभूति द्वारा इंगित किया जाता है। स्वयं साइमलिंक निम्न प्रारूप के हैं:

[के | एस] + एनएन + [स्ट्रिंग]

कहा पे:

  • nn एक संख्या है जो उन लिपियों को चलाने के क्रम को निर्धारित करती है
  • स्ट्रिंग स्क्रिप्ट का नाम है जैसा कि /etc/init.d/ में दिखाई देता है
  • और अंत में K या S उस कमांड को निर्धारित करता है जिसे स्क्रिप्ट के साथ लागू किया गया है: क्रमशः रोकें या शुरू करें।

इसलिए, यदि आप चाहते हैं कि आपकी स्क्रिप्ट बूट अनुक्रम में चले, तो आपको निम्नलिखित कार्य करने होंगे:

  1. अपनी स्क्रिप्ट /etc/init.d/ में डालें और इसे निष्पादन योग्य बनाएं
  2. लक्ष्य रनलेवल निर्धारित करें कि स्क्रिप्ट को शुरू होना चाहिए (कंसोल के लिए टिप 2 और ग्राफिकल यूजर इंटरफेस के लिए 5)। जैसे कुछ के साथ निर्धारित किया जा सकता हैrunlevel
  3. इस रनवे में पहले से मौजूद स्क्रिप्ट्स पर एक नज़र डालें ls /etc/rc<target runlevel>.d/और दो अंकों की संख्या चुनें, जो पहले से मौजूद किसी अन्य से अधिक हो।
  4. आपके वितरण के लिए विशिष्ट उपयोगिता का उपयोग करना जैसे update-rc.dकि डेबियन आधारित या chkconfigफेडोरा की तरह या मैन्युअल रूप से, अपने init स्क्रिप्ट में एक सिमलिंक /etc/rc.d/S बनाएं।

5
आपने जो वर्णन किया है वह वास्तव में sysVinit है। हालांकि यह सच है कि सिस्टमड कैसे sysVinit के साथ संगत है, एक महत्वपूर्ण अंतर है - सब कुछ समानांतर में किया जाता है। दो प्रकार की सेवाएँ, sysVinit सेवाएँ और systemd सेवाएँ भी हैं। आपका उत्तर sysVinit सेवाओं के बाद कुछ निष्पादित करने में मदद कर सकता है, लेकिन जरूरी नहीं कि सिस्टम वाले ही हों।
सैम

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