मशीन को रिबूट करने के बाद स्क्रिप्ट कैसे जारी रखें?


18

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

sudo reboot

जब मशीन वापस आती है, तो अधिक काम होता है जिसे इस स्क्रिप्ट को करने की आवश्यकता होती है। इस स्क्रिप्ट में काम जारी रखने के लिए मैं कुछ कैसे कॉन्फ़िगर करूं?

मैं मान रहा हूं कि कुछ जगह है कि मैं एक शेल स्क्रिप्ट लिख सकता हूं, जैसे कि इसे अगले रिबूट में निष्पादित किया जाएगा। ऐसी जगह कहाँ है? मैं देखता हूं कि क्रोन का @reboot निर्देश है। मुझे यह भी पता है कि अपाचे जैसी सेवाएं बूटस्टार्ट द्वारा शुरू की जाती हैं। क्या उनमें से कोई उपयुक्त तंत्र होगा? यदि हां, तो यह कैसे ट्रिगर होगा?

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

यह सवाल रिबूट के बाद आपके एप्लिकेशन स्टेट को बचाने के तरीके के बारे में पूछता है। मेरी स्क्रिप्ट में बहुत अधिक स्थिति नहीं है, इसलिए मैं इसे प्रबंधित कर सकता हूं। मुझे सिर्फ यह जानने की जरूरत है कि अगले रीबूट के बाद इस स्क्रिप्ट को कैसे चलाया जाए।

मेरा विशिष्ट संस्करण Ubuntu Linux 14.04 है। मूल स्क्रिप्ट को सिस्टम प्रशासक द्वारा कमांड लाइन पर शुरू किया जाता है (जैसा कि क्रोन से चलने के लिए विरोध किया जाता है)।


स्क्रिप्ट के भीतर एक रिबूट का उपयोग केवल तभी किया जाना चाहिए जब आप इसे टाल न सकें। उदाहरण के लिए एक नया कर्नेल इंस्टॉलेशन। मुझे यकीन है कि आप रिबूट के बिना अपना काम कर सकते हैं। क्या आप निर्दिष्ट कर सकते हैं कि आपको रिबूट की आवश्यकता क्यों है?
अराजकता

1
यह स्क्रिप्ट एक नया कर्नेल स्थापित करता है (या उपयुक्त अपग्रेड कहता है जो ऐसा कर सकता है)। यह भी जाँच करता है कि रिबूट करने से पहले रिबूट वास्तव में आवश्यक है या नहीं।
स्टीफन ओस्टरमिलर

"स्क्रिप्ट के भीतर एक रिबूट का उपयोग केवल तभी किया जाना चाहिए जब आप इसे टाल नहीं सकते।" - @चोस क्यों?
जॉन रेड

जवाबों:


16

एक प्रणाली पर, केवल एक चीज जो वास्तव में लगातार है एक फ़ाइल है। यह बहुत ज्यादा है जो आपको उपयोग करना चाहिए। यहाँ एक init.d स्क्रिप्ट का उपयोग कर एक समाधान है।

आइए निम्नलिखित (सरल) लिपि पर विचार करें /etc/init.d/myupdate:

#! /bin/sh

### BEGIN INIT INFO
# Provides:          myupdate
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin

case "$1" in
    start)
        /path/to/update/script
        ;;
    stop|restart|reload)
        ;;
esac

यदि आप इसे सक्रिय करते हैं update-rc.d myupdate defaults, तो startकार्रवाई बूट पर निष्पादित की जाएगी। अब, जब आपकी अपडेट स्क्रिप्ट रिबूट के लिए कॉल करती है:

touch /var/run/rebooting-for-updates
sudo reboot

इस समाधान के साथ, आप अपनी अद्यतन स्क्रिप्ट को दो भागों में विभाजित कर सकते हैं:

before_reboot(){
    # Do stuff
}

after_reboot(){
    # Do stuff
}

if [ -f /var/run/rebooting-for-updates ]; then
    after_reboot
    rm /var/run/rebooting-for-updates
    update-rc.d myupdate remove
else
    before_reboot
    touch /var/run/rebooting-for-updates
    update-rc.d myupdate defaults
    sudo reboot
fi

यह before_rebootकोड अनुभाग निष्पादित करेगा , एक फ़ाइल बनाएँ /var/runऔर रिबूट करें। बूट होने पर, स्क्रिप्ट को फिर से कॉल किया जाएगा, लेकिन चूंकि फ़ाइल मौजूद है, after_rebootइसके बजाय कहा जाएगा before_reboot

ध्यान दें कि update-rc.dरूट विशेषाधिकारों की आवश्यकता है।

एक फ़ाइल का उपयोग किए बिना ( स्टीफन ओस्टरमिलर की टिप्पणी से):

यदि आप getoptsउपयोगिता से परिचित हैं , तो आप फ़ाइलों के बजाय विकल्पों का उपयोग करना चाह सकते हैं। Init स्क्रिप्ट में, स्क्रिप्ट को इसके साथ कॉल करें:

/path/to/update/script -r

और आपकी स्क्रिप्ट में, फ़ाइलों के बजाय विकल्पों की जांच करें। विकल्प के बिना एक बार अपनी स्क्रिप्ट को कॉल करें, और init.d इसे बूट पर फिर से कॉल करेगा, इस बार के साथ -r

# Set AFTER_REBOOT according to options (-r).

if [ "x$AFTER_REBOOT" = "xyes" ]; then
    # After reboot
else
    # Before reboot
fi

आपको यहां विकल्प से निपटने के बारे में और जानकारी मिलेगी (केवल लघु विकल्पों के लिए) । मैंने update-rc.dइसे एक बार की नौकरी (किसी अन्य टिप्पणी से) रखने के लिए कॉल के साथ अपनी स्क्रिप्ट को भी संपादित किया ।


2
यह कॉल करने के लिए आसान हो सकता है /path/to/update/script --after-rebootसे /etc/init.d/myupdateकी उपस्थिति पर निर्भर के बजाय /var/run/rebooting-for-updates। फिर सीधे बूट पर कॉल किए जाने पर इसे अलग-अलग तर्क दिए जाएंगे।
स्टीफन ओस्टरमिलर

अच्छा लगा, विकल्पों के बारे में नहीं सोचा। मुझे संपादित करने की अनुमति दें;)
जॉन डब्ल्यूएच स्मिथ

1
इसके अलावा, चूंकि यह एक बार का काम है, इसलिए मैं शायद स्क्रिप्ट में update-rc.d myupdate defaultsऔर इसके update-rc.d myupdate removeसाथ ही लेखन और निष्कासन को जोड़ना चाहूंगा , /etc/init.d/myupdateताकि यह आसपास बैठी फाइलों को छोड़ न दे।
स्टीफन ओस्टरमिलर

मैंने इसे लागू कर दिया है और यह अच्छी तरह से काम करता है। केवल दूसरी चीज जो मैं जोड़ूंगा, वह यह है कि मेरे डेबियन आधारित सिस्टम को INIT INFOअनुभाग में अतिरिक्त आइटमों की आवश्यकता है : wiki.debian.org/LSBInitScripts
स्टीफन

मैं वास्तव में इसे सरल रखना चाहता था;) उचित init.d लिखना थोड़ा समय लगता है, फिर भी मुझे खुशी है कि आप अधिक जानकारी के लिए गए: ये स्क्रिप्ट बहुत आसान हो सकती हैं।
जॉन डब्ल्यूएच स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.