ความแตกต่างระหว่าง /etc/rc.local และ /etc/init.d/rc.local คืออะไร


30

ฉันต้องการเพิ่มถาวรiptablesกฎใหม่ของฉันVPSและหลังจากสั้นค้นหา google ฉันรู้สึกประหลาดใจว่ามีสองตำแหน่งกฎนี้สามารถเพิ่มดูเหมือนว่าเหมือน: และ/etc/rc.local /etc/init.d/rc.localอาจมีบางคนรู้ว่าเพราะเหตุใดจึงมีสองที่สำหรับรหัสเริ่มต้นที่ง่ายในการวาง มันเป็นลินุกซ์รสชาติที่เฉพาะเจาะจง (แต่อูบุนตูมีทั้งคู่!)? หรือหนึ่งในนั้นถูกคัดค้าน


1
หนึ่งควรเป็น symlink อื่น ๆ
Ignacio Vazquez-Abrams

2
@ IgnacioVazquez-Abrams บน Ubuntu Server 12.04 x86 LTS พวกเขาต่างกันโดยสิ้นเชิง :(.
grigoryvp

1
@ IgnacioVazquez-Abrams: บน Debian พวกเขาดูเหมือนจะแตกต่างเช่นกัน
Emanuel Berg

3
น่าจะเช็คเอาท์: ฉันถามคำถามเกี่ยวกับ/etc/rc.localกลับในขณะ
Emanuel Berg

คำตอบ:


31

/etc/init.dได้รับการปรับปรุงบน Ubuntu สำหรับความเข้ากันได้ย้อนหลังกับสิ่ง sysvinit ถ้าคุณดูที่จริง/etc/init.d/rc.localคุณจะเห็น (เช่นจากเซิร์ฟเวอร์ LTS 12.04):

#! /bin/sh
### BEGIN INIT INFORMATION
# Provides:          rc.local
# Required-Start:    $remote_fs $syslog $all
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
### END INIT INFO

และ"Run /etc/rc.local"เป็นสิ่งที่มันทำ ความสมบูรณ์ของ/etc/rc.localคือ:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exit 0

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

ดังนั้นจึงเป็นบริการและสามารถเรียกใช้เช่นนี้ ฉันเพิ่มechoบรรทัด/etc/rc.localและ:

»service rc.local start
hello world

อย่างไรก็ตามฉันไม่เชื่อว่ามีการอ้างอิงโดยสิ่งใดใน/etc/initไดเรกทอรี (ไม่ init.d!) พุ่งพรวด:

»initctl start rc.local
initctl: Unknown job: rc.local

มีบริการ "rc" อยู่เล็กน้อย

»initctl list | grep rc
rc stop/waiting
rcS stop/waiting
rc-sysinit stop/waiting

แต่ดูเหมือนว่าไม่มีสิ่งใดที่เกี่ยวข้องกับ rc.local


5

นี่คือสิ่งที่เฉพาะเจาะจงการกระจาย (เช่นคุณจะไม่พบ rc.local ที่แตกต่างกันใน CentOS)

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

ฉันไม่แน่ใจจริงๆว่าทำไม Ubuntu ถึงยังคงรักษาทั้งสองไว้ได้ (บางทีคนอื่นอาจทำให้บางส่วนแสงนี้ !!)


อะไรคือความแตกต่างระหว่างคำสั่งที่เรียกใช้งาน "as a service" และรหัสที่ "เพิ่งเปิดตัวตอนบูท"? มันปลอดภัยหรืออะไรนะ?
grigoryvp

ความแตกต่างที่สำคัญระหว่างทั้งสองคือบริการและกระบวนการ ;) ฉันเดาว่าความตั้งใจขั้นพื้นฐานจะเป็นแค่ความปลอดภัยเท่านั้น คุณอาจพบว่าลิงค์นี้น่าสนใจ: unixmen.com/managing-your-services-and-processes-in-linux
pragmatic

มันไม่ถูกต้อง! พวกเขาไม่ใช่สคริปต์เดียวกัน แต่เป็นบริการเดียว - /etc/init.d/rc.localหยุดสิ่งที่เริ่ม/etc/rc.local(ดูคำตอบของฉันสำหรับรายละเอียดเพิ่มเติม)
goldilocks

@ goldilocks: ขอบคุณสำหรับคำตอบที่เป็นคำอธิบายที่ละเอียดและละเอียดถี่ถ้วน แต่ฉันไม่ชัดเจนว่าคำตอบส่วนใดที่คุณอ้างถึงไม่ถูกต้อง? การพูดแบบหนึ่งในฐานะบริการหมายถึงสามารถทำสิ่งที่ "เริ่มต้น" และ "หยุด" ในขณะที่อีกวิธีหนึ่งเป็นเพียงกระบวนการ โปรดแก้ไขให้ฉันด้วยถ้าฉันไม่รู้สึกที่นี่
ทางปฏิบัติ

2
@pragmatic เพราะ/etc/rc.localสคริปต์เป็นกระบวนการที่ปฏิบัติการภายใต้/etc/initd/rc.localสคริปต์เช่นเดียว (เช่น) จะเป็นขั้นตอนการปฏิบัติการควบคุมโดย/bin/syslog /etc/initd/syslogคุณพูดอย่างชัดเจนว่า/etc/rc.localเป็นเพียงสคริปต์บูตและ/etc/initd/rc.localเป็นบริการระดับการทำงานแยกต่างหากอย่างสมบูรณ์
goldilocks
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.