เรียกใช้สคริปต์เมื่อเริ่มระบบครั้งแรกเท่านั้น


12

มีวิธีใช้สำนวนในอูบุนตูเพื่อเรียกใช้สคริปต์เฉพาะในครั้งแรกที่มีการบูตเครื่องหรือไม่? (EC2)

คำตอบ:


14

ไม่ แต่คุณอาจต้องการวางสคริปต์ของคุณ/etc/init.d/scriptและลบตัวเอง:

#!/bin/bash

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

# Delete me
rm $0

โปรดทราบว่า$0เป็น bash-specific (version> = 3) เพื่อจุดประสงค์ในการใช้งานร่วมกันได้คุณสามารถระบุชื่อไฟล์สคริปต์แทนโดยทำให้เป็นแบบทั่วไปน้อยกว่า:rm /etc/init.d/script
Andrejs Cainikovs

4
$ 0 ไม่ใช่ทุบตีเฉพาะและได้รับการสนับสนุนนานกว่าทุบตี 3.x ได้รับรอบ (และได้รับการสนับสนุนใน Bourne, Korn, zsh และอื่น ๆ ) จุดผสานคือ $ 0 มีข้อกำหนดเส้นทางแบบเต็มหรือแบบสัมพัทธ์ นี่คือลิงก์ไปยังวิธีที่เชื่อถือได้ในการรับเส้นทางแบบเต็มหากคุณต้องการ: stackoverflow.com/questions/4774054/…
จิมเดนนิส

7

สร้างไฟล์ติดตามเมื่อสคริปต์ทำงาน หากไฟล์มีอยู่แล้วให้ออกจากสคริปต์


4
แม้ว่ามันอาจดูไม่ชัดนักในตอนแรก แต่นี่อาจเป็นทางออกที่ดีกว่าการลบสคริปต์เนื่องจากยังคงมีความเป็นไปได้ที่จะเรียกใช้สคริปต์อีกครั้งหากคุณต้องการ
msanford

7

การรวมสองคำตอบแรกสมมติว่าคุณตั้งชื่อสคริปต์ของคุณ/usr/local/bin/firstboot.shไว้ที่ท้าย/etc/rc.local(สคริปต์นี้จะทำงานทุกครั้งที่บูต) สคริปต์จะเป็นแบบนี้

#! / bin / ทุบตี

ธง = "/ var / log / firstboot.log"
ถ้า [! -f $ FLAG]; แล้วก็
   # ใส่ประโยคการเริ่มต้นของคุณที่นี่
   echo "นี่เป็นการบูตครั้งแรก"

   # บรรทัดถัดไปสร้างไฟล์ว่างดังนั้นจึงไม่เรียกใช้การบูตครั้งถัดไป
   แตะ $ FLAG
อื่น
   echo "ไม่ทำอะไรเลย"
Fi

สิ่งนี้ไม่จำเป็นต้องทำงานกับ sysmtemd ฉันจำเป็นต้องเพิ่ม sleep 20 เพื่อให้แน่ใจว่าเป็นสคริปต์ล่าสุด
mrossi

หากคุณตั้งชื่อมัน /etc/rc.local/99-firstboot.sh ควรรันครั้งสุดท้าย
JohnDavid

3

ฉันประหลาดใจที่ผลลัพธ์ที่ฉันเห็นสำหรับการค้นหาตะขอที่ได้รับการกำหนดไว้อย่างดีและรองรับ 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


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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.