มีวิธีใช้สำนวนในอูบุนตูเพื่อเรียกใช้สคริปต์เฉพาะในครั้งแรกที่มีการบูตเครื่องหรือไม่? (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 / ทุบตี ธง = "/ var / log / firstboot.log" ถ้า [! -f $ FLAG]; แล้วก็ # ใส่ประโยคการเริ่มต้นของคุณที่นี่ echo "นี่เป็นการบูตครั้งแรก" # บรรทัดถัดไปสร้างไฟล์ว่างดังนั้นจึงไม่เรียกใช้การบูตครั้งถัดไป แตะ $ FLAG อื่น echo "ไม่ทำอะไรเลย" Fi
ฉันประหลาดใจที่ผลลัพธ์ที่ฉันเห็นสำหรับการค้นหาตะขอที่ได้รับการกำหนดไว้อย่างดีและรองรับ Ubuntu "บูตครั้งแรก" ดูเหมือนว่าฝูงชน Red Hat / Fedora / CentOS ได้ถูกจับมานานกว่าทศวรรษ ที่อยู่ใกล้เทียบเท่าอูบุนตูน่าจะเป็นOEM-config-firstboot
แนวคิดของการแสดงความrm $0
ประสงค์เพียงอย่างเดียวก็ใช้ได้ผล แต่ในทางเทคนิคมีความหมายที่น่าสนใจบางส่วนที่เกี่ยวข้อง ซึ่งแตกต่างจากล่ามสคริปต์อื่น ๆ ส่วนใหญ่ภายใต้ Unix เปลือกสคริปต์จะอ่านและประมวลผลหนึ่งบรรทัด / คำสั่งในเวลา หากคุณยกเลิกการเชื่อมโยง ( 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
ขณะนี้มีบางกรณีที่เป็นไปได้มุมที่แปลกเกี่ยวกับ symlink และกรณีที่สคริปต์ถูกเรียกเป็นชื่อเปลือย (บังคับให้เชลล์เพื่อค้นหา$PATH
สคริปต์
แต่ดูเหมือนว่าbash
(อย่างน้อยในเวอร์ชัน 3.2) จะเติม$0
ด้วยพา ธ หากค้นหาพา ธ และปล่อยให้ $ 0 เป็นเส้นทางแบบสัมพัทธ์หรือพา ธ แบบสัมบูรณ์ที่ใช้เรียกสคริปต์ ดูเหมือนว่ามันจะไม่ทำการปรับสภาพหรือแก้ปัญหาเส้นทางสัมพัทธ์หรือ symlink
น่าจะเป็นที่สะอาด "firstboot" สำหรับอูบุนตูจะสร้างแพคเกจขนาดเล็ก (.deb) ที่มีสคริปต์ที่จะอยู่ใน/etc/init.d/firstboot
และหลังการติดตั้งสคริปต์ที่ใช้update-rc.d
ในการเชื่อมโยงที่เป็น runlevel 1 ( /etc/rc1.d
) (โดยใช้คำสั่งที่ชอบ: update-rc.d firstboot defaults
) .. และจากนั้นให้บรรทัดสุดท้ายทำการปิดใช้งานหรือลบโดยใช้สิ่งที่ต้องการ:update-rc.d firstboot disable
นี่คือลิงก์ไปยังDebian update-rc.d HOWTO
คุณสามารถสำรองข้อมูล rc.local ปัจจุบันไปยัง rc.local.bak
จากนั้นคุณสามารถมีสิ่งที่คุณต้องการทำใน rc.local และท้ายที่สุดเพียงแค่ mv /etc/rc.loca.bak /etc/rc.local
คำถามเกี่ยวกับการเรียกใช้สคริปต์เมื่อบูตครั้งแรกของ 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
เป็น bash-specific (version> = 3) เพื่อจุดประสงค์ในการใช้งานร่วมกันได้คุณสามารถระบุชื่อไฟล์สคริปต์แทนโดยทำให้เป็นแบบทั่วไปน้อยกว่า:rm /etc/init.d/script