बूटिंग / स्टार्टअप के दौरान स्क्रिप्ट चलाना; init.d बनाम क्रोन @reboot


48

मैं वर्तमान में सिस्टम के स्टार्टअप / बूटिंग में स्क्रिप्ट चलाने के लिए init.dऔर क्रोन के बीच के अंतर को समझने की कोशिश कर रहा हूं @reboot

के उपयोग @reboot(इस विधि में उल्लेख किया गया था इस मंच से hs.chandra ), कुछ क्या आसान है बस में जाकर crontab -eऔर एक बनाने @reboot /some_directory/to_your/script/your_script.txtऔर उसके बाद your_script.txtहर बार प्रणाली रिबूट है क्रियान्वित किया जाएगा। की गहराई से स्पष्टीकरण @rebootहै यहां

वैकल्पिक रूप से अपनी स्क्रिप्ट /etc/init.d/your_script.txtकी दूसरी पंक्ति में एम्बेड करके अर्थात:

#!/bin/bash
# /etc/init.d/your_script.txt

आप चल सकते हैं chmod +x /etc/init.d/your_script.txtऔर your_script.txtहर बार सिस्टम बूट होने पर चलाने के लिए भी परिणाम होना चाहिए ।

Q1: दोनों के बीच मुख्य अंतर क्या हैं?
Q2: कौन सा अधिक मजबूत है?
Q3: क्या दोनों में से एक बेहतर है?
Q4: क्या बूटिंग के दौरान स्क्रिप्ट चलाने का यह सही तरीका है?

मैं स्टार्टअप के दौरान चलाने के लिए एक बैश .sh फ़ाइल शामिल करूंगा।


2
इसके अलावा प्रासंगिक है systemd, link1 link2
Rufus

जवाबों:


37

init.d, जिसे SysV स्क्रिप्ट के रूप में भी जाना जाता है, का अर्थ सिस्टम इनिशियलाइज़ेशन और शटडाउन के दौरान सेवाओं को शुरू करना और बंद करना है। ( /etc/init.d/स्क्रिप्ट संगतता के लिए सिस्टमड सक्षम सिस्टम पर भी चलाए जाते हैं)।

  • स्क्रिप्ट को बूट और शटडाउन के दौरान निष्पादित किया जाता है (डिफ़ॉल्ट रूप से)।
  • स्क्रिप्ट एक init.d स्क्रिप्ट होनी चाहिए, न कि केवल एक स्क्रिप्ट। यह समर्थन करना चाहिए startऔर stopऔर अधिक (देखें डेबियन नीति )
  • सिस्टम बूट के दौरान स्क्रिप्ट निष्पादित की जा सकती है (आप कब परिभाषित कर सकते हैं)।

crontab(और इसलिए @reboot)।

  • क्रोन किसी भी नियमित कमांड या स्क्रिप्ट को निष्पादित करेगा, यहां कुछ भी विशेष नहीं है।
  • कोई भी उपयोगकर्ता एक @rebootस्क्रिप्ट जोड़ सकता है (केवल रूट नहीं)
  • प्रणाली के साथ एक डेबियन प्रणाली पर: क्रोन के @reboot के दौरान निष्पादित किया जाता है multi-user.target
  • SysV (नहीं systemd) के साथ डेबियन सिस्टम पर, crontab (5) उल्लेख: कृपया ध्यान दें कि स्टार्टअप, जहाँ तक @reboot का संबंध है, वह समय है जब क्रोन (8) डेमन स्टार्टअप। विशेष रूप से, यह कुछ सिस्टम डेमॉन, या अन्य सुविधाओं से पहले हो सकता है, स्टार्टअप थे। यह मशीन के बूट ऑर्डर अनुक्रम के कारण है।
  • बूट और समय-समय पर एक ही स्क्रिप्ट को शेड्यूल करना आसान है।

/etc/rc.localइसे अक्सर बदसूरत या पदावनत माना जाता है (कम से कम रेडहैट द्वारा ), फिर भी इसमें कुछ अच्छी विशेषताएं थीं:

  • rllocal किसी भी नियमित कमांड या स्क्रिप्ट को निष्पादित करेगा, यहां कुछ भी विशेष नहीं है।
  • SysV (नहीं systemd) के साथ एक डेबियन प्रणाली पर: rc.local(लगभग) शुरू करने के लिए अंतिम सेवा थी।
  • लेकिन सिस्टमियन के साथ डेबियन सिस्टम पर: डिफ़ॉल्ट रूप rc.localसे निष्पादित network.targetहोता है (नहीं network-online.target!)

Systemd के बारे में network.targetऔर network-online.target, पढ़ने के लिए सेवाएं चलाने के बाद नेटवर्क है


मेरे यूनूंटा 16.04 में, मुझे /var/run/crond.rebootहर बार फाइल को हटाने की आवश्यकता होती है , अगर मैं चाहता हूं कि @reboot क्रोन नौकरियों से हर बार सिस्टेम शुरू हो जाए। यदि यह फ़ाइल अस्तित्व में है @reboot क्रोन नौकरियों को निष्पादित नहीं किया जाएगा
अल्बर्ट

@ अल्बर्ट-कैटाल्टा उबंटू में एक बग जमा करें!
फ्रैंकलिन पिआट

12

सबसे पहले, एक स्पष्टीकरण क्रम में है:

  • init.d वह निर्देशिका है जो सेवाओं को नियंत्रित करने वाली लिपियों को संग्रहीत करती है, जो सेवाओं की शुरुआत और रोक को नियंत्रित करती है जैसे कि httpdयाcron
  • rc.local एक ऐसी सेवा है जो सिस्टम स्टार्टअप प्रक्रिया के भाग के रूप में मनमानी लिपियों को चलाने की अनुमति देती है

इस संदर्भ में कि क्या इसका बेहतर उपयोग करना rc.localया cronअपनी स्क्रिप्ट को चलाना, मुझे संदेह है कि यह व्यावहारिकता से अधिक सौंदर्यशास्त्र का सवाल है। cron, एक कार्य अनुसूचक के रूप में, एक मशीन के रखरखाव या रखरखाव करने के लिए एक विधि के रूप में करना है, जैसे कि अद्यतन की जाँच करना, कैश की सफाई करना, या सुरक्षा ऑडिट करना। इसका मतलब यह नहीं है कि यह उन कार्यों को करने तक सीमित है, क्योंकि यह निर्दिष्ट समय (जैसे @reboot) पर वांछित किसी भी स्क्रिप्ट या कमांड को चला सकता है ।

rc.localदूसरी ओर, उपयोग करना , सिस्टम कॉन्फ़िगरेशन प्रकार के कार्य के भीतर अधिक गिर जाएगा, जैसा rc.localकि मशीनों init सिस्टम द्वारा निष्पादित किया जा रहा है, आमतौर पर मशीनों के नेटवर्क कॉन्फ़िगरेशन, सेवाओं या वातावरण (लेकिन फिर से, केवल तक सीमित नहीं है) के लिए जिम्मेदार है ये कार्य)।

हालांकि, इन दोनों बिंदुओं को इस तथ्य से गुस्सा होना चाहिए कि सभी init सिस्टम एक rc.localतंत्र की पेशकश नहीं करते हैं , और सभी क्रोन डेमॉन एक @rebootpsuedo टैग की पेशकश नहीं करते हैं ।

बोनस अंक

जैसा कि उल्लेख किया गया है, init.dवह निर्देशिका है जिसमें ऐसी स्क्रिप्ट शामिल हैं जो सेवाओं को नियंत्रित करती हैं जिन्हें आपके सिस्टम पर शुरू या रोका जा सकता है (कम से कम मशीनों पर जो एक SysVप्रकार की init प्रणाली का उपयोग करती हैं)। आपके init सिस्टम और आपकी स्क्रिप्ट के उद्देश्य के आधार पर, आपकी स्क्रिप्ट को init स्क्रिप्ट में बदलने के लिए उचित हो सकता है कि एक सेवा के रूप में उसी तरह चलाया जाए। हालाँकि, यह आपके init सिस्टम पर बहुत अधिक निर्भर है क्योंकि इन फ़ाइलों का निर्माण कैसे किया जाता है, इसके आस-पास की रूपरेखा बहुत भिन्न हो सकती है।

अंतिम शब्द

यह भी ध्यान दिया जाना चाहिए कि आम तौर पर स्क्रिप्ट को समाप्त करने के .shबजाय एक प्रत्यय के साथ समाप्त होता है .txt, क्योंकि यह तुरंत बताता है कि फ़ाइल एक पाठ फ़ाइल के बजाय एक शेल स्क्रिप्ट है। कहा जा रहा है, बशर्ते कि या तो फ़ाइल के शीर्ष पर एक शेबंग ( #!/bin/bash) हो, या इसे कहा जाता है bash /path/to/script.whatever, यह स्क्रिप्ट को निष्पादित करने के मामले में कोई बात नहीं होनी चाहिए।


bashस्क्रिप्ट आमतौर पर (और यकीनन नहीं होनी चाहिए) एक shएक्सटेंशन के साथ समाप्त होती हैं ।
3

1
@mikeserv: जबकि मैं सहमत हूं कि अधिकांश बैश स्क्रिप्ट्स (और यकीनन नहीं होनी चाहिए) का कोई विस्तार नहीं है, आमतौर पर ".sh" एक्सटेंशन के साथ बैश स्क्रिप्ट होती हैं - देखें "क्या एक .sh फ़ाइल है?"
डेविड कैरी

@DavidCary - यह एक बहुत ही आधिकारिक स्रोत की तरह प्रतीत नहीं होता है।
मिकसेर

1
विकिपीडिया: "फ़ाइल नाम एक्सटेंशन की सूची" और विकिपीडिया: "शेल स्क्रिप्ट" भी आश्चर्यजनक रूप से सामान्य ".sh" एक्सटेंशन का उल्लेख करते हैं, संदर्भों के साथ।
डेविड कैरी

1
" आम तौर पर बैश स्क्रिप्ट के .shबजाय एक प्रत्यय के साथ समाप्त होता है.txt " - विशेष रूप से अर्थ shबैश स्क्रिप्ट (या अन्य शेल स्क्रिप्ट) के लिए फ़ाइल नाम एक्सटेंशन के रूप में अधिक सटीक है, txtजो आमतौर पर सादे-पाठ को दर्शाता है। आप जो भी एक्सटेंशन बनाते हैं उसका उपयोग आप कर सकते हैं, लेकिन आम सम्मेलन होगा, अगर एक एक्सटेंशन का उपयोग shकरना अधिक उचित होगा और आमतौर पर उपयोग किया जाता है; हालांकि इसकी आवश्यकता नहीं है, विशेष रूप से उन लिपियों के लिए जिनका निष्पादन करने का इरादा है PATH
wraeth

3

मैं अपना जवाब नीचे लिख रहा हूं;

Q1: दोनों के बीच मुख्य अंतर क्या है?

उपरोक्त अन्य उपयोगकर्ताओं द्वारा बताए गए मतभेदों के अलावा, मैं इस बात को उजागर करना चाहूंगा कि @reboot क्रोन डेमॉन पर निर्भर है। आप उस क्रम पर निर्भर हैं जिसमें क्रोन शुरू होता है। हालांकि अधिकांश मामलों में, क्रोन ठीक शुरू होता है, लेकिन इसे शुरू करने में कुछ समय विफल हो सकता है (कम से कम मैंने अपनी कुछ परियोजनाओं में कुछ विफलताएं देखी हैं)। जब आप एक init स्क्रिप्ट लिखते हैं, तो विफलता आमतौर पर तब होती है जब आप अपनी स्क्रिप्ट में कुछ गलत करते हैं (एक पूर्व: एक सेवा पर भरोसा करना जो आपकी सेवा के बाद शुरू होगी)

Q2: कौन सा अधिक मजबूत है?

उपरोक्त के आधार पर, मुझे लगता है कि यह अधिक मजबूत है। लेकिन पहले जवाब में "फ्रैंकलिन पिआट" द्वारा उल्लिखित एक और बिंदु है। आमतौर पर आपको डेमॉन के लिए init स्क्रिप्ट की जरूरत होती है और आपको पॉलिसी का पालन करना चाहिए

Q3: क्या दोनों में से एक बेहतर है?

मुझे ऐसा नहीं लगता (r। क्लोक थोड़ा सा पुराना और पदावनत है)

Q4: बूटिंग के दौरान चलाने के लिए स्क्रिप्ट को एम्बेड करने का यह सही तरीका है?

हाँ। आमतौर पर आवेदन / पैकेज लेखक इस तरह से करते हैं।

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