วิธีเรียกใช้สคริปต์ระหว่างการบูตในฐานะรูท


59

ฉันมีสคริปต์ที่เปิดใช้งาน wifi โดยอัตโนมัติโดยไม่ใช้เครือข่ายผู้จัดการ แต่ฉันไม่ทราบวิธีเรียกใช้สคริปต์ในฐานะรูทขณะที่ระบบกำลังบูท ฉันจะทำให้สคริปต์ทำงานโดยอัตโนมัติในระหว่างการบูตได้อย่างไร


โปรแกรม Auto เริ่มต้นมีการกำหนดค่าในการautostartแสดงออกหรือ*.serviceไฟล์ในหลายสถานที่เช่นเดียวกับในหรือinit.d crontabดูสิ่งนี้: unix.stackexchange.com/a/525845/43233
Noam Manos

คำตอบ:


54

วางสคริปต์ที่คุณต้องการรันในไดเร็กทอรี /etc/init.d และทำให้สคริปต์สามารถเรียกทำงานได้

chmod 755 myscript

หลังจากนั้นให้สร้างลิงก์สัญลักษณ์ในไดเรกทอรีระดับการทำงานที่คุณต้องการใช้ตัวอย่างเช่นหากคุณต้องการเรียกใช้โปรแกรมในกราฟิกรันเลเวล 2 กราฟิกระดับเริ่มต้นสำหรับ Ubuntu คุณต้องวางไว้ใน/etc/rc2.dไดเรกทอรี คุณไม่สามารถวางไดเรคทอรีนั้นได้คุณจะต้องบ่งบอกว่ามันจะรันเมื่อใดโดยการระบุการเริ่มต้นด้วย“ S” และลำดับการดำเนินการเป็นสิ่งสำคัญ วางหลังจากทุกอย่างอื่นที่อยู่ในไดเรกทอรีโดยให้เป็นตัวเลขที่สูงขึ้น

ถ้าสคริปต์สุดท้ายที่จะทำงานเป็นrc.localและมันเป็นชื่อแล้วคุณจะต้องเพิ่มสคริปต์ของคุณเป็นS99rc.localS99myscript

ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript

แต่ละ/etc/rc*.dไดเรกทอรีที่เข้ากันได้ย้อนหลังมีลิงค์สัญลักษณ์ไปยัง/etc/init.d/ไดเรกทอรี


1
โปรดทราบว่าภายใต้ Ubuntu Server 14.04 ฉันต้องใช้/etc/rc2.dแทนrc3.dตามที่ระบุในตัวอย่าง ดูเหมือนว่าrc2.dไม่ใช่แค่ระดับการรันแบบกราฟิก
แบรด

1
cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.dจะนำคุณไปยัง/etc/rc?.dไดเรกทอรีที่สอดคล้องกับระดับเริ่มต้นของคุณ
เควิน

1
แต่: "หากสคริปต์สุดท้ายที่จะเรียกใช้คือrc.localและตั้งชื่อS99rc.localจากนั้นคุณจะต้องเพิ่มสคริปต์ของคุณเป็นS99myscript" คุณหมายถึง: "ถ้าสคริปต์สุดท้ายที่จะรันmyscriptและมีชื่อS99myscriptคุณต้องเพิ่มสคริปต์ของคุณเป็นS99myscript" ???
Dor

6
โปรดทราบว่าสิ่งนี้จะไม่ทำงานกับ systemd (เช่นเริ่มต้นด้วย Ubuntu 16.04) ดูสิ่งนี้แทน
Alexander Revo

26

รวมคำสั่ง/etc/rc.localด้วย มันจะถูกเรียกใช้เมื่อใดก็ตามที่มีการเปลี่ยนแปลงระดับผู้ใช้งาน

หมายเหตุ: คุณต้องใส่คำสั่งก่อนบรรทัดสุดท้ายใน /etc/rc.local ที่มี: "exit 0"


3
หมายเหตุ: คุณต้องใส่คำสั่งก่อนบรรทัดสุดท้ายใน/etc/rc.localที่มี: exit 0
rubo77

3
/etc/rc.localในอูบุนตู 15.10 มีความคิดเห็นว่า "สคริปต์นี้จะถูกดำเนินการในตอนท้ายของแต่ละระดับผู้ใช้หลายคน" ดังนั้นสคริปต์สามารถทำงานได้หลายครั้งระหว่างการบูตใช่ไหม
jarno

@jamo ใช่ใน runlevel แต่ละครั้ง ฉันไม่ทราบว่าสิ่งนี้เกี่ยวข้องกับการเรียกใช้ "ตอนเริ่มต้นระบบ" ซึ่งมักจะหมายถึง "เรียกใช้ครั้งเดียวตอนเริ่มระบบ"
erm3nda

17

ใช้crontabตัวเลือกเพื่อให้สคริปต์ของคุณทำงานหลังจากรีบูต

คุณสามารถทำได้โดยการเพิ่ม@rebootรหัสในcron

เปิด crontab โดยผู้ใช้รูท:

$ sudo crontab -e

เพิ่มระเบียนถัดไปที่ด้านล่าง:

@reboot yourScriptPath 

นั่นจะทำสิ่งที่คุณต้องการ


คุณหมายถึงการใช้คำสั่งcrontab -eซึ่งไม่ต้องการสิทธิ์ผู้ใช้ขั้นสูงหรือไม่ ฉันสงสัยว่าถ้ามันสามารถเรียกใช้สคริปต์ที่ต้องทำงานเป็น root
jarno

ฉันทดสอบสิ่งนี้ มันไม่ได้รันสคริปต์ในฐานะรูท
jarno

4
คุณต้องเพิ่มบรรทัดในขณะที่ใช้คำสั่งsudo crontab -eเพื่อให้มันรันสคริปต์เป็น root ในระหว่างการเริ่มต้น
jarno

อย่าลืมที่จะลบ/var/run/crond.rebootถ้าไม่จะไม่ทำงาน
Albert Català

สำหรับบันทึกเท่านั้นฉันแน่ใจว่า @jarno จะรู้แล้ว ผู้ใช้แต่ละคนมีภารกิจ cron ของตัวเองดังนั้นหากคุณเพิ่มลงในงานของคุณ (ใช้ crontab -e โดยไม่ต้อง sudo) สคริปต์จะถูกรันโดยผู้ใช้ของคุณ ดังนั้นคุณต้องเรียกใช้เป็นรูทเพื่อให้สามารถเรียกใช้สคริปต์ในฐานะรูทเมื่อบูต
eddieferetro

9

สิ่งนี้ใช้ได้กับฉันใน Ubuntu 17.04:

  1. สร้างไฟล์สคริปต์ทัวร์อย่างdisable_cdromสะดวกสำหรับคุณ home/yterle/disable_cdromในกรณีของฉัน ในกรณีของฉัน:

    #!/bin/sh
    eject /dev/sr0 -i 1
  2. ทำให้ปฏิบัติการได้ chmod 775 disable_cdrom

  3. นำทางไป/etc/systemd/systemและสร้างserviceไฟล์ขึ้นมา ตัวอย่างเช่นsudo gedit /etc/systemd/system/disable_cdrom.service

disable_cdrom.serviceหน้าตาของฉันเป็นแบบนี้:

[Unit]
Description=Disable cdrom

[Service]
Type=oneshot
ExecStart=/bin/sh /home/yterle/disable_cdrom

[Install]
WantedBy=multi-user.target

ไหนExecStartชี้ไปเรียกใช้สคริปต์ของคุณด้วย/bin/sh

จากนั้นเรียกใช้systemctl enable disable_cdrom.serviceเพื่อเปิดใช้งานบริการ systemd


1
การออกเสียงลงคะแนนนี้ขึ้นเป็นมันเป็นสิ่งที่ผมกำลังมองหา แต่ฉันคิดว่าคุณหมายถึงsystemctl enable disable_cdrom.service
KennetRunner

5

รวมไฟล์สคริปต์ของคุณไว้/etc/init.d/ ด้วยด้วยสิทธิ์อนุญาตจากนั้นตั้งระดับการทำงานที่แตกต่างกัน

$ update-rc.d script-name default

มันจะทำให้สคริปต์ของคุณในการเริ่มต้นการบูต


ไม่ทำงานสำหรับฉันบน Kali Linux v2.0 คุณหมายถึงupdate-rc.d script-name enableอะไร
Sopalajo de Arrierez

update-rc.d <script-name> เชลล์สคริปต์เริ่มต้นซึ่งคุณมีการคัดลอกที่ /etc/init.d/ <script-name>
MS Parmar

4

สร้างไฟล์ข้อความแบบนี้ใน/etc/cron.d/:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

@reboot   root    yourScriptPath

(คุณควรแทนที่yourScriptPathด้วยพา ธ ไปยังสคริปต์ที่คุณต้องการเรียกใช้)


1

ระมัดระวังในการเพิ่มสคริปต์ไปrc.local- ฉันติดอยู่ในหน้าจอสแปลชเพราะมัน การกดAlt+ F1เปิดเผยสิ่งที่เกิดขึ้นด้านหลังหน้าจอเริ่มต้น (สคริปต์rc.localกำลังทำงานอยู่)

ฉันไม่สามารถออกไปได้

  • Ctrl+ Alt+ Delหรือ
  • Alt+ PrtSc+ Kหรือ
  • Ctrl+ Alt+F#

ไม่มีอะไรทำงาน

ฉันต้องบูตจากอิมเมจ USB Ubuntu ค้นหาrc.localให้สิทธิ์ตัวเองในการไฟล์และลบทิ้ง ฉันเดาว่าคุณไม่ควรทำอะไรถ้าคุณไม่รู้ว่าคุณกำลังทำอะไรอยู่

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