क्या उबंटू में एक मुहावरेदार तरीका है एक स्क्रिप्ट को चलाने के लिए केवल पहली बार एक मशीन को बूट किया जाता है? (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