วัตถุประสงค์และการใช้งานทั่วไปของ /etc/rc.local


73

ส่วนหัวมีลักษณะดังนี้:

#!/bin/sh -e
#
# rc.local - executed at the end of each multiuser runlevel
#
# Make sure that the script will "exit 0" on success or any other
# value on error.

อะไรคือสาเหตุของไฟล์นี้ (มันมีไม่มาก) และคุณมักจะใส่คำสั่งอะไรลงไป? "multiuser runlevel" คืออะไร? (ฉันเดาว่าrc"รันคำสั่ง" หรือไม่)


2
ฉันไม่รู้ว่านี่เป็นจุดประสงค์ "เป็นทางการ" ของไฟล์หรือไม่ แต่ฉันพบว่าฉันสามารถใช้ไฟล์สำหรับสิ่งที่ควรจะเกิดขึ้นในการเริ่มต้นและจะต้องเข้าถึงผู้ใช้ขั้นสูง แต่ไม่ต้องให้รหัสผ่าน โดยทั่วไปจะเกี่ยวข้องกับสีแป้นพิมพ์และสิ่งอื่น ๆ ตรวจสอบตัวอย่างบางส่วนที่นี่
Emanuel Berg

คำตอบ:


66

runlevelเป็นรัฐของระบบซึ่งบ่งบอกว่าจะเป็นในขั้นตอนของการบูตหรือรีบูตเครื่องหรือปิดเครื่องหรือในโหมดผู้ใช้คนเดียวหรือทำงานตามปกติ โปรแกรมinitดั้งเดิมจัดการกับการกระทำเหล่านี้โดยสลับไปยังระดับ runlevel ที่เกี่ยวข้อง ภายใต้ Linux runlevels อยู่ภายใต้การประชุม :

  • S ในขณะที่ทำการบูท
  • 0 ในขณะที่ปิดตัวลง
  • 6 ขณะรีบูตเครื่อง
  • 1 ในโหมดผู้ใช้คนเดียวและ
  • 2 ถึง 5 ในการทำงานปกติ

Runlevels 2 ถึง 5 เป็นที่รู้จักกันในชื่อ multiuser runlevels เนื่องจากอนุญาตให้ผู้ใช้หลายคนเข้าสู่ระบบซึ่งแตกต่างจาก runlevel 1 ซึ่งมีไว้สำหรับผู้ดูแลระบบเท่านั้น

เมื่อ runlevel เปลี่ยนแปลงไป init จะเรียกใช้สคริปต์ rc (บนระบบที่มี init ดั้งเดิม - มีทางเลือกอื่นเช่นUpstartและSystemd ) โดยทั่วไปแล้วสคริปต์ rc เหล่านี้จะเริ่มและหยุดบริการของระบบและจัดทำโดยการกระจาย

สคริปต์/etc/rc.localนี้ใช้สำหรับผู้ดูแลระบบ มันถูกดำเนินการตามธรรมเนียมหลังจากเริ่มให้บริการระบบตามปกติทั้งหมดแล้วในตอนท้ายของกระบวนการสลับไปยังระดับผู้ใช้หลายคน คุณอาจใช้เพื่อเริ่มบริการที่กำหนดเองตัวอย่างเช่นเซิร์ฟเวอร์ที่ติดตั้ง/usr/localมา การติดตั้งส่วนใหญ่ไม่จำเป็นต้อง/etc/rc.localมีไว้สำหรับกรณีส่วนน้อยที่จำเป็น


2
ฉันพบว่าวันนี้ว่าใน FreeBSD ปัจจุบัน rc.local อาจจะถูกประหารชีวิตเร็ว ไม่แน่นอนหลังจากเริ่มให้บริการระบบปกติทั้งหมดแล้ว ฉันต้องการเสียงบี๊บเมื่อ sshd เข้าถึงเครื่องที่ไม่มีหัวและใช้งานrc.localไม่ได้ด้วยเหตุผลนี้ เนื่องจากคำถามเดิมเกี่ยวกับ Debian ความคิดเห็นนี้อาจไม่เกี่ยวข้องกับ OP
MvG

1
@MvG ขอบคุณสำหรับข้อมูล rc.localใช้งานได้ตามปกติ แต่ฉันเห็นว่า FreeBSD หยุดทำเช่นนั้นเมื่อพวกเขาเปลี่ยนไปใช้ระบบที่พึ่งพา ในใจคุณแม้ว่าจะrc.localถูกเรียกใช้หลังจากนั้น/etc/rc.d/sshdแต่ก็จะไม่ทำงานอย่างสมบูรณ์แบบ: rc.localจะถูกเรียกใช้ในไม่ช้าหลังจากsshdกระบวนการเริ่มต้นขึ้นมันอาจถูกเรียกใช้ก่อนที่จะsshdเริ่มฟังเครือข่าย (แต่เราจะพูดถึงสิบวินาทีใน ส่วนใหญ่ในการตั้งค่าทั่วไป)
Gilles

ฉันพยายามที่จะใช้มันเพื่อตั้งค่าเครือข่ายสำหรับตู้คอนเทนเนอร์ lxc และเริ่มโดยอัตโนมัติ iptables-apply /root/iptablesแต่มันหยุดหลังจาก ฉันกำลังหาข้อผิดพลาด (รอการรีบูตครั้งถัดไป) แต่ถ้าคุณได้รับคำแนะนำฉันก็ยินดี
x-yuri

1
@ x-yuri สิ่งนี้ต้องการข้อมูลมากกว่าวิธีที่คุณโพสต์ไว้ที่นี่ ฉันไม่รู้ด้วยซ้ำว่า "มัน" คืออะไรใน "หยุด" ถามคำถามใหม่ที่อธิบายสิ่งที่คุณทำ
Gilles

14

rc หมายถึง "การควบคุมการทำงาน"

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

โดยทั่วไปแล้วเซิร์ฟเวอร์จะได้รับการจัดการโดยตัวประมวลผลบริการ (ภายใต้ชื่อต่าง ๆ ) ซึ่งรองรับการเชื่อมต่อเครือข่ายและในทางกลับกันเสมือนว่าคุณมีคอนโซลแบบใช้สายจริงๆ

สำหรับrc.localไฟล์นี่เป็นความสะดวกในการอนุญาตให้คุณระบุออบเจ็กต์ "โลคัล" (เฉพาะไซต์) ทั้งหมด (daemons และ / หรือสคริปต์หนึ่งครั้งเมื่อบูต) ที่คุณต้องการเริ่ม คุณอาจเลือกใช้กระบวนทัศน์นี้หรือเติม '/etc/init.d' จริง ๆ ด้วยสคริปต์เริ่ม / หยุดอย่างเหมาะสม


1
โอเค แต่ทำไมไฟล์ถึงอยู่ตรงนั้นและโดยทั่วไปแล้วคุณจะใช้มันเมื่อไรและอย่างไร (เช่นคำสั่งอะไรที่เหมาะสมที่จะใส่ไว้)
Emanuel Berg

4

ฉันใช้เป็นหลักสำหรับสองสิ่ง:

  1. เพื่อบันทึกวันที่และเวอร์ชั่นเคอร์เนลของการรีบูตทุกครั้ง ง่ายหนึ่งซับที่สามารถจะเพิ่มเข้าไปในระบบได้โดยไม่ต้องบรรจุใด ๆ รอบ ... uptimedและไกลน้อยแนวโน้มที่จะบูตประวัติศาสตร์การเสียหายกว่าทำงาน

  2. เพื่อฟื้นฟูไดเร็กทอรี /etc/rc.boot/ เก่าที่เคยเป็นเดเบียนจนถึงไม่กี่ปีที่ผ่านมา ฉันยังมีสคริปต์ง่าย ๆ อยู่ตรงนั้นซึ่งไม่คุ้มค่ากับความพยายามในการเขียนใหม่เป็นสคริปต์ init.d (เช่นสคริปต์ Q & D เพื่อส่งเมล dmesg ไปที่รูทและอีกอันใช้ hdaparm เพื่อปิดการใช้งาน spindown และ blockdev เพื่อตั้งค่า ขนาดล่วงหน้า) และฉันดีใจที่พวกเขาสามารถทำงานหลังจากสคริปต์การบูตอื่น ๆ ทั้งหมด

เช่น

echo "$(date +%s),$(date),$(uname -a)"  >> /var/log/reboot.log

[ -d /etc/rc.boot ] && run-parts /etc/rc.boot

นอกจากนี้ฉันได้เขียนสคริปต์ /etc/rc.local ปีก่อนหน้านี้สำหรับ centos และ debian distros เพื่อรับข้อมูลเมตาสไตล์ ec2 จาก openstack (เปิดhttp://169.254.169.254/) เพื่อให้ VMs ได้รับ IP, ชื่อโฮสต์, คีย์ ssh และข้อมูลเฉพาะอินสแตนซ์อื่น ๆ . cloud-init ได้รับการพอร์ตไปยัง distros เหล่านี้แล้วดังนั้นสคริปต์จึงล้าสมัยแล้ว


3

rc.localไฟล์บนDebianเป็นส่วนใหญ่สำหรับการทำงานร่วมกันกับระบบรูปแบบที่ไม่ใช่ init คุณไม่ควรใช้มัน

แต่ขอแนะนำให้คุณคัดลอก/etc/init.d/Skeletonไปยังสคริปต์เริ่มต้นใหม่สำหรับสิ่งที่คุณต้องการให้เกิดขึ้นขณะเปลี่ยน runlevels จากนั้นใช้inservเพื่อเปิดใช้งาน


ปรับปรุง: ตามความคิดเห็นด้านล่างคำตอบนี้ไม่แนะนำอีกต่อไป อย่างไรก็ตามคำตอบนี้ถูกโพสต์เมื่อหลายปีก่อนการตัดโครงกระดูกและโครงกระดูกนั้นยังคงมีอยู่ใน Debian ที่ไม่เสถียร ณ เดือนมกราคม 2019


unix.stackexchange.com/a/480897/5132 /etc/init.d/skeletonไม่ใช่วิธี
JdeBP
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.