ฉันจะสร้างสคริปต์ใน /etc/init.d เริ่มต้นตอนบูตได้อย่างไร


83

ฉันคิดว่าฉันอ่านบางสิ่งบางอย่างในขณะนี้ แต่ฉันจำไม่ได้ว่ามันเสร็จสิ้นแล้ว เป็นหลักฉันมีบริการ/etc/init.dที่ฉันต้องการเริ่มต้นโดยอัตโนมัติในเวลาบูต ฉันจำได้ว่ามันเกี่ยวกับการเชื่อมโยงสคริปต์เข้ากับ/etc/rc.dไดเรกทอรี แต่ฉันจำไม่ได้ในปัจจุบัน คำสั่งสำหรับสิ่งนี้คืออะไร?

ฉันเชื่อว่าฉันใช้อนุพันธ์ของ Fedora / CentOS


ขึ้นอยู่กับระบบปฏิบัติการของคุณ คุณใช้ยูนิกซ์ชนิดใดและหาก Linux มีการกระจายแบบใด ซึ่งในหมู่/etc/init, /etc/init.d, /etc/rc.d, /etc/rc.localและอีกไม่กี่มันไม่ได้?
Gilles

1
ฉันคิดว่าฉันใช้ CentOS หรืออะไรทำนองนั้น คำตอบจะแตกต่างกันสำหรับ Debian หรือไม่? ฉันสนใจวิธีแก้ปัญหาสำหรับเดเบียนด้วย
Naftuli Kay

คำตอบ:


109

หากคุณอยู่ในระบบที่ใช้ Red Hat ดังที่คุณกล่าวไว้คุณสามารถทำสิ่งต่อไปนี้:

  1. สร้างสคริปต์และวางใน/etc/init.d(เช่น/etc/init.d/myscript) สคริปต์ควรมีรูปแบบต่อไปนี้:
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

รูปแบบนั้นค่อนข้างมาตรฐานและคุณสามารถดูสคริปต์ที่มีอยู่/etc/init.dได้ จากนั้นคุณสามารถใช้สคริปต์เพื่อต้องการหรือ/etc/init.d/myscript start หน้าคนอธิบายส่วนหัวของสคริปต์:chkconfig myscript startckconfig

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.

ตัวอย่าง start, stop และ code status ใช้ฟังก์ชันตัวช่วยที่กำหนดไว้ /etc/init.d/functions

  1. เปิดใช้งานสคริปต์

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. ตรวจสอบว่าเปิดใช้งานสคริปต์แล้วแน่นอนคุณควรเห็น "เปิด" สำหรับระดับที่คุณเลือก

    $ chkconfig --list | grep myscript
    

3
Chkconfig คือสิ่งที่คุณต้องการ +1
whoami

เหตุใด init จึงเริ่มบางสิ่งบางอย่างที่ runlevels 2, 3, 4 และ 5 คุณไม่ต้องระวังที่จะหลีกเลี่ยงการเริ่มต้นเซิร์ฟเวอร์ที่ runlevel 2 หรือไม่? และ runlevel 4 ไม่ได้ถูกกำหนดบน RHEL อยู่แล้วเหตุใดจึงลองเริ่มที่ runlevel นั้น ไม่วิจารณ์แค่อยากรู้ ฉันเป็นผู้ใช้ Slackware ดั้งเดิม
Bruce Ediger

4 ไม่ได้ถูกกำหนดบน RHEL แต่มีอยู่จริง คุณสามารถขโมยเพื่อสิ่งที่คุณทำเองได้
Kevin M

ส่วนหัวนำมาจากหน้า man chkconfig โดยส่วนตัวฉันติดกับ 235 หรือแค่ 35 ในกรณีส่วนใหญ่
สามารถ

มีบันทึกที่ฉันสามารถดูหรือไม่ว่ามีบางสิ่งที่ไม่สามารถเริ่มต้นในระหว่างการเริ่มต้นได้
Utkarsh Sinha

10

คุณทดสอบสิ่งที่ runlevel เครื่องของคุณเริ่มเป็นปกติ

runlevel

บ่อยครั้งที่นี่คือ 5 หรือ 2 - มีการประชุมที่หลากหลาย แต่ไม่มีอะไรที่จัดตั้งขึ้นจริงๆ afaik Ubuntu ใช้ 2 ในขณะที่การกระจายเดิมฉันใช้เสมอ

  • 1 ผู้ใช้คนเดียว (ผู้ใช้ super)
  • 2 ผู้ใช้หลายคน
  • 3 ผู้ใช้หลายคน + เครือข่าย
  • 4 ไม่ได้ใช้ / ผู้ใช้สามารถกำหนดได้
  • 5 ผู้ใช้หลายคนเครือข่าย + X11

จากนั้นคุณสร้าง symlink จากสคริปต์เริ่มต้นของคุณหรืออาจจะ/etc/init.d/foobarเป็น/etc/rc2.d/SXYfoobar

S หมายถึง 'เริ่มสคริปต์นี้ใน runlevel นี้ (ที่นี่: 2) XY เป็นตัวเลขทศนิยมสองหลักซึ่งเกี่ยวข้องกับลำดับสคริปต์เริ่มทำงาน

หากคุณขึ้นอยู่กับสคริปต์ S45barfoo ที่จะเรียกใช้ก่อนหน้านี้และ S55foofoo ขึ้นอยู่กับสคริปต์ของคุณคุณจะต้องเลือก xy ระหว่าง 45 ถึง 55 สำหรับหมายเลขที่เท่ากันลำดับการบู๊ตจะไม่ถูกกำหนด

อูบุนตูขณะที่เปลี่ยน (สลับ) upstartขั้นตอนการเริ่มต้นอีกเรียกว่า

และหมายเหตุ: ลิงก์ที่เชื่อมโยงไปไม่เสมอไป/etc/rcX.d- บางครั้งมันเป็น/etc/init/rcX.dหรือคล้ายกัน แต่ควรหาได้ง่าย

หากคุณต้องการเริ่มต้นบางสิ่งบางอย่างในตอนท้ายของสคริปต์เริ่มต้น/etc/rc.localจะเป็นไฟล์ที่จะมองหา แต่ถ้ามันขึ้นอยู่กับ X11 ที่ทำงานอยู่แล้วคุณอาจมองหาตัวเลือกเริ่มต้นอัตโนมัติของสภาพแวดล้อมเดสก์ทอปของคุณหรือ/etc/X11/Xsession.d/ด้วยรูปแบบที่คล้ายกัน ข้างบน.

หากคุณขึ้นอยู่กับเครือข่ายถูกขึ้นมีไดเรกทอรีที่แยกต่างหาก (ถ้า-up.d) และสำหรับอุปกรณ์ที่ติดตั้งอยู่ภายนอกเช่น /etc/udev/rules.d/USB


ไม่มีคำสั่งที่เชื่อมโยงคุณหรือไม่ ฉันคิดว่าฉันจำบางอย่างเช่นนั้นได้
Naftuli Kay

1
ไม่ใช่update-rc.dเหรอ
Naftuli Kay

GUI หรือ commandline? DE ของคุณอาจจัดเตรียมเครื่องมือเพื่อทำเครื่องหมายระดับของเหลวซึ่งจะเริ่มหรือหยุดสคริปต์ของคุณ ฉันเห็นบางอย่างเช่นนั้น แต่จำชื่อไม่ได้และวิธีระบุหมายเลข (xy)
ไม่ทราบผู้ใช้

บรรทัดคำสั่ง. มันจัดการ symlinking สำหรับคุณและช่วยให้คุณสามารถเปิดสวิตช์ว่าสคริปต์บางอย่างทำงานหรือไม่
Naftuli Kay

3

ดังที่ Naftuli Tzvi Kay ถามเกี่ยวกับ Debian ด้านบน: เริ่มต้นด้วย Debian 6 สคริปต์ของคุณควรมีส่วนหัว LSB (ฐานมาตรฐาน Linux) ซึ่งระบุการพึ่งพาและความสามารถ ( ดูที่หน้า debian wiki )

หากส่วนหัวของ LSB มีอยู่คุณสามารถใช้insservเพื่อรวมสคริปต์ของคุณในกระบวนการบูต ( ดูหน้าเดเบียนอื่น wiki )

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