จะรันเชลล์สคริปต์เมื่อเริ่มต้นได้อย่างไร


13

ฉันสร้างสคริปต์เพื่อเริ่มต้นเซิร์ฟเวอร์ (คำถามแรกของฉัน) ตอนนี้ฉันต้องการให้มันทำงานในการบูตระบบและเริ่มเซิร์ฟเวอร์ที่กำหนดไว้ ฉันควรทำอย่างไรเพื่อให้เสร็จ

การค้นพบของฉันบอกว่าฉันวางไฟล์นี้ไว้ใน/etc/init.dตำแหน่งและมันจะทำงานเมื่อระบบจะบู๊ต แต่ฉันไม่สามารถเข้าใจว่าอาร์กิวเมนต์แรกของการเริ่มต้นจะเป็นstartอย่างไร นี่คือที่กำหนดไว้ล่วงหน้าเพื่อใช้startเป็น$1? หากฉันต้องการมีกรณีstartallที่จะเริ่มต้นเซิร์ฟเวอร์ทั้งหมดในสคริปต์แล้วตัวเลือกที่ฉันสามารถจัดการคืออะไร?

สคริปต์ของฉันเป็นเช่นนี้:

#!/bin/bash

case "$1" in
start)
     start
    ;;
stop)
    stop
    ;;

restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart)"
;;
esac

ฉันรู้ว่ามันเก่า ... แต่เชลล์ควรเป็น '#! / bin / sh' ไม่ใช่ '#! / bin / bash' / bin / sh มีแนวโน้มที่จะทำงานในกรณีของเครื่องที่มีปัญหาระหว่างการเริ่มต้น (เช่น / usr / lib ไม่สามารถติดตั้งได้)
Rich Homolka

คำตอบ:


19

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

http://en.wikipedia.org/wiki/Runlevel

ดังนั้นถ้าคุณมี:

/etc/init.d/importantscript

จากนั้นคุณต้องการไฟล์ (ว่าง):

/etc/rc.d/rc3.d/S20importantscript
/etc/rc.d/rc6.d/K20importantscript

S หมายถึงการเริ่มต้นและ K หมายถึงการฆ่า เมื่อเครื่องของคุณเริ่มทำงานระบบจะพูดว่า "อ้าฉันกำลังใช้งานที่ RunLevel 3 เรามาที่ rc3.d เพื่อดูว่าสคริปต์ใดใน '/etc/init.d' ที่ต้องรันและเรียงตามลำดับ" ในกรณีนี้ระบบจะจัดเรียงตาม 'S' แล้วตามด้วยหมายเลขหลัง 'S' และจะดำเนินการ '/etc/init.d/importantscript start' 20 สำหรับการสั่งซื้อเท่านั้น ... สคริปต์ของคุณจะทำงานอยู่ด้านหลัง 'S19' และต่อหน้า 'S21' คุณสามารถสร้างไฟล์เหล่านี้ได้ง่ายๆโดยทำ:

sudo touch /etc/rc.d/rc3.d/S20importantscript

นี่เป็นบทสรุปที่ดีเช่นกัน: http://www.linux.com/news/enterprise/systems-management/8116-an-introduction-to-services-runlevels-and-rcd-scripts


ไม่ใช่เรื่องปกติที่จะ "ln -s /etc/init.d/script" เป็น rcX.d / *?
ozma

8

คุณไม่จำเป็นต้อง --- และไม่ควรสร้างไฟล์ใน/etc/rc.d/rcN.d/; สิ่งที่คุณควรทำแทนคือใส่ความคิดเห็นในการอ่านสคริปต์เริ่มต้นของคุณ

# chkconfig NNN A B

ที่NNNเป็นชุดของ runlevels ที่คุณต้องการสคริปต์ที่ใช้งาน (เช่น345ถ้ามันใช้งานในระดับการทำงาน3, 4และ5) และAและBเป็นจุดเริ่มต้นและหยุดการจัดลำดับความสำคัญ จากนั้นchkconfig --add foo(สมมติว่าชื่อสคริปต์ของคุณfoo) จะสร้างไฟล์/etc/rc.d/rcN.d/ด้วยชื่อที่เหมาะสม

จากนั้นคุณสามารถใช้service foo barเพื่อส่งbarข้อความไปยังสคริปต์ของคุณ (เช่นstart, stopสิ่ง - นั่นคือสิ่งที่คุณ$1มาจาก)


0

$ 1 คืออาร์กิวเมนต์บรรทัดคำสั่งที่ส่งผ่านไปยังสคริปต์ของคุณซึ่งเป็นหนึ่งในการเริ่มหยุดหรือรีสตาร์ท ในopenSUSEฉันจำไม่ได้ว่ามีตัวเลือกในการส่งผ่านข้อโต้แย้งอื่น ๆ ในสคริปต์เมื่อใช้ตัวแก้ไข runlevel ดังนั้นฉันคิดว่าสิ่งเหล่านี้น่าจะเป็นสิ่งเดียวที่คุณควรใช้

ฉันไม่ได้ใช้CentOSตัวเอง แต่มันก็ดูเหมือนว่าโปรแกรมที่จะควบคุมสิ่งที่จะเริ่มต้นที่ระดับการทำงานเป็นntsysv

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