केवल पहले बूट पर स्क्रिप्ट चलाएँ


12

क्या उबंटू में एक मुहावरेदार तरीका है एक स्क्रिप्ट को चलाने के लिए केवल पहली बार एक मशीन को बूट किया जाता है? (EC2)।

जवाबों:


14

नहीं, लेकिन आप अपनी स्क्रिप्ट को इसमें रखना चाहते हैं /etc/init.d/scriptऔर इसे स्वयं हटा सकते हैं:

#!/bin/bash

echo "Bump! I'm your first-boot script."

# Delete me
rm $0

कृपया ध्यान दें, $0बैश-विशिष्ट (संस्करण> = 3) है। अनुकूलता के उद्देश्य से, आप इसके बजाय स्क्रिप्ट फ़ाइल नाम प्रदान कर सकते हैं, जिससे यह कम जेनेरिक हो:rm /etc/init.d/script
बाल्कन कैनिकोव्स

4
$ 0 bash विशिष्ट नहीं है और इसे bash 3.x की तुलना में अधिक समय तक समर्थित किया गया है (और यह बॉर्न, कॉर्न, zsh और अन्य में समर्थित है)। चिपके बिंदु यह है कि क्या $ 0 में पूर्ण या सापेक्ष पथ विनिर्देश हैं। यदि आपको इसकी आवश्यकता है तो पूर्ण पथ प्राप्त करने का एक विश्वसनीय तरीका यहां दिया गया है: stackoverflow.com/questions/4774054/…
जिम डेनिस

7

स्क्रिप्ट चलने पर ट्रैकिंग फ़ाइल बनाएँ। यदि फ़ाइल पहले से मौजूद है, तो स्क्रिप्ट से बाहर निकलें।


4
हालांकि यह पहली नज़र में ऐसा प्रतीत नहीं हो सकता है, यह स्क्रिप्ट को हटाने से बेहतर समाधान हो सकता है क्योंकि यह इसे फिर से ट्रिगर करने की संभावना को बरकरार रखता है, क्या आपको कभी भी ऐसा करना चाहिए।
मसनफोर्ड

7

पहले दो उत्तरों को मिलाकर आपको अपनी स्क्रिप्ट का नाम देते हुए /usr/local/bin/firstboot.shइसे अंत में रखें /etc/rc.local(यह स्क्रिप्ट हर बूट पर चलती है) स्क्रिप्ट इस तरह से चलती है

#! / Bin / bash

फ्लैग = "/ var / log / firstboot.log"
अगर [ ! -f $ FLAG]; फिर
   # यहां अपने आरंभिक वाक्यों को दर्ज करें
   इको "यह पहला बूट है"

   # अगली पंक्ति एक खाली फ़ाइल बनाती है, इसलिए यह अगली बूट नहीं चलेगी
   $ FLAG स्पर्श करें
अन्य
   गूंज "कुछ मत करो"
फाई

यह आवश्यक रूप से sysmtemd के साथ काम नहीं कर रहा है। मुझे यह सुनिश्चित करने के लिए एक नींद 20 जोड़ने की आवश्यकता है कि यह आखिरी स्क्रिप्ट रन है।
मृस्सी

यदि आप इसे /etc/rc.local/99-firstboot.sh नाम देते हैं, तो इसे अंतिम चलना चाहिए।
जॉनडविड

3

मैं उन परिणामों पर हैरान हूं, जिन्हें मैं एक अच्छी तरह से परिभाषित और समर्थित उबंटू "पहली बूट" हुक के लिए खोज रहा हूं। रेड हैट / फेडोरा / सेंटोस भीड़ की तरह लगता है कि यह एक दशक से अधिक समय के लिए है। निकटतम उबंटू समकक्ष OEM-config-firstboot प्रतीत होता है ।

बस rm $0काम करने का विचार काम करेगा। लेकिन, तकनीकी रूप से कुछ दिलचस्प शब्दार्थ शामिल हैं। यूनिक्स के तहत अधिकांश अन्य स्क्रिप्ट दुभाषियों के विपरीत, एक समय में एक पंक्ति / कथन को पढ़ा और संसाधित किया जाता है। यदि आप rmइसके नीचे से फ़ाइल को अनलिंक ( ) करते हैं, तो शेल का उदाहरण जो उस स्क्रिप्ट को संसाधित कर रहा है, अब एक अनाम फ़ाइल (कोई भी फ़ाइल जो खुली लेकिन अनलिंक की गई है) के साथ काम कर रही है।

इस तरह एक फ़ाइल पर विचार करें:

#!/bin/bash
rm $0
echo "I've removed myself: $0"
ls -l $0
cat <<COMMENTARY
   This is a test.
   I'm still here, because the "here" doc is being fed to 'cat'
   via the anonymous file through the open file descriptor.
   But I cannot be re-exec'd
COMMENTARY
exec $0

यदि आप इसे कुछ rmself.shऔर (हार्ड) लिंक से बचाते हैं , tstतो कुछ इस तरह से चल रहा ./tstहै जैसे आउटपुट के रूप में कुछ दिखाना चाहिए:

$ ./tst 
I've removed myself: ./tst
ls: ./tst: No such file or directory
   This is a test.
   I'm still here, because the "here" doc is being fed to 'cat'
   via the anonymous file through the open file descriptor.
   But I cannot be re-exec'd
./tst: line 11: /home/jimd/bin/tst: No such file or directory
./tst: line 11: exec: /home/jimd/bin/tst: cannot execute: No such file or directory

अब सहानुभूति और मामलों के संबंध में कुछ विषम संभावित कोने के मामले हैं जहां स्क्रिप्ट को नंगे नाम के रूप में लागू किया गया था ( $PATHस्क्रिप्ट के लिए खोज करने के लिए शेल को मजबूर करना ।

लेकिन ऐसा लगता है कि bash(कम से कम संस्करण 3.2 में) $0यदि पथ खोजा गया हो तो पथ के साथ आगे बढ़ता है और अन्यथा स्क्रिप्ट को लागू करने के लिए जो भी रिश्तेदार या निरपेक्ष पथ का उपयोग किया जाता है, वह $ 0 सेट करता है। यह किसी भी सामान्यीकरण या संकल्प के सापेक्ष पथ को करने के लिए प्रतीत नहीं होता है और न ही सहानुभूति।

संभवतः उबंटू के लिए सबसे साफ "फर्स्टबूट" एक छोटा पैकेज (.deb) बनाना होगा जिसमें एक स्क्रिप्ट रखी जानी चाहिए /etc/init.d/firstbootऔर एक पोस्ट-इंस्टाल स्क्रिप्ट जो update-rc.dलिंक 1 ( /etc/rc1.d) (जैसे कमांड का उपयोग करके) में लिंक करने के लिए उपयोग करती है update-rc.d firstboot defaults। .. और फिर अंतिम पंक्ति को निष्क्रिय करना या कुछ का उपयोग करके हटाना है:update-rc.d firstboot disable

यहाँ डेबियन अपडेट- rc.d HOWTO का लिंक दिया गया है


0

आप वर्तमान rc.local से rc.local.bak पर बैकअप ले सकते हैं

फिर आपके पास वह सामान हो सकता है जिसे आप rc.local में करना चाहते हैं और अंत में सिर्फ mv /etc/rc.loca.bak /etc/rc.local।


0

प्रश्न EC2 के पहले बूट पर एक स्क्रिप्ट चलाने के बारे में था। आप cloud-initइस उद्देश्य के लिए उपयोग कर सकते हैं ।

जब एक नया EC2 उदाहरण की शुरूआत आप को परिभाषित करने का विकल्प होता है User dataके तहत Advanced datails। यदि आप cloud-initवहां स्क्रिप्ट रखते हैं, तो इसे पहले बूट पर ही निष्पादित किया जाएगा।

उदाहरण के लिए आप निम्नलिखित को इसमें रख सकते हैं User data:

#cloud-config

runcmd:
  - /usr/bin/command1.sh
  - /usr/bin/command2.sh

आउटपुट को लिखा जाएगा /var/log/cloud-init-output.log

Cloud-initइससे बहुत अधिक कर सकते हैं। इसे खासतौर पर क्लाउड इंस्टेंस के शुरुआती इनिशियलाइजेशन के लिए तैयार किया गया है। यहां डॉक्स देखें: http://cloudinit.readthedocs.io/en/latest/index.html

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