क्या उबंटू में एक मुहावरेदार तरीका है एक स्क्रिप्ट को चलाने के लिए केवल पहली बार एक मशीन को बूट किया जाता है? (EC2)।
क्या उबंटू में एक मुहावरेदार तरीका है एक स्क्रिप्ट को चलाने के लिए केवल पहली बार एक मशीन को बूट किया जाता है? (EC2)।
जवाबों:
नहीं, लेकिन आप अपनी स्क्रिप्ट को इसमें रखना चाहते हैं /etc/init.d/scriptऔर इसे स्वयं हटा सकते हैं:
#!/bin/bash
echo "Bump! I'm your first-boot script."
# Delete me
rm $0
स्क्रिप्ट चलने पर ट्रैकिंग फ़ाइल बनाएँ। यदि फ़ाइल पहले से मौजूद है, तो स्क्रिप्ट से बाहर निकलें।
पहले दो उत्तरों को मिलाकर आपको अपनी स्क्रिप्ट का नाम देते हुए /usr/local/bin/firstboot.shइसे अंत में रखें /etc/rc.local(यह स्क्रिप्ट हर बूट पर चलती है) स्क्रिप्ट इस तरह से चलती है
#! / Bin / bash फ्लैग = "/ var / log / firstboot.log" अगर [ ! -f $ FLAG]; फिर # यहां अपने आरंभिक वाक्यों को दर्ज करें इको "यह पहला बूट है" # अगली पंक्ति एक खाली फ़ाइल बनाती है, इसलिए यह अगली बूट नहीं चलेगी $ FLAG स्पर्श करें अन्य गूंज "कुछ मत करो" फाई
मैं उन परिणामों पर हैरान हूं, जिन्हें मैं एक अच्छी तरह से परिभाषित और समर्थित उबंटू "पहली बूट" हुक के लिए खोज रहा हूं। रेड हैट / फेडोरा / सेंटोस भीड़ की तरह लगता है कि यह एक दशक से अधिक समय के लिए है। निकटतम उबंटू समकक्ष 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 का लिंक दिया गया है
प्रश्न 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
$0बैश-विशिष्ट (संस्करण> = 3) है। अनुकूलता के उद्देश्य से, आप इसके बजाय स्क्रिप्ट फ़ाइल नाम प्रदान कर सकते हैं, जिससे यह कम जेनेरिक हो:rm /etc/init.d/script