Apa perbedaan antara /etc/rc.local dan /etc/init.d/rc.local?

30

Saya ingin menambahkan iptablesaturan permanen ke aturan baru saya VPS, dan setelah pencarian google singkat saya terkejut bahwa ada dua tempat aturan ini dapat ditambahkan, yang sepertinya identik: /etc/rc.localdan /etc/init.d/rc.local. Mungkin ada yang tahu mengapa ada dua tempat untuk kode startup yang sederhana untuk ditempatkan? Apakah ini rasa khusus Linux (tetapi ubuntu memiliki keduanya!)? Atau salah satunya sudah usang?

grigoryvp
sumber
1
Satu harus menjadi symlink ke yang lain.
Ignacio Vazquez-Abrams
2
@ IgnacioVazquez-Abrams Pada Ubuntu Server 12,04 x86 LTS mereka benar-benar berbeda :(.
grigoryvp
1
@ IgnacioVazquez-Abrams: Di Debian mereka juga tampak berbeda.
Emanuel Berg
3
Layak dicoba: Saya mengajukan pertanyaan tentang /etc/rc.localbeberapa waktu lalu.
Emanuel Berg

Jawaban:

31

/etc/init.ddikelola di ubuntu untuk kompatibilitas dengan hal-hal sysvinit. Jika Anda benar-benar melihat /etc/init.d/rc.localAnda akan melihat (juga dari Server 12,04 LTS):

#! /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

Dan "Jalankan /etc/rc.local" persis seperti yang dilakukannya. Keseluruhannya /etc/rc.localadalah:

#!/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

Saya kira tujuan melakukan ini adalah untuk menyediakan tempat sederhana yang mati untuk meletakkan perintah shell yang ingin Anda jalankan saat boot, tanpa harus berurusan dengan stop | start service stuff, yang ada di /etc/init.d/rc.local.

Jadi itu sebenarnya sebuah layanan, dan dapat dijalankan seperti itu. Saya menambahkan echobaris ke /etc/rc.localdan:

»service rc.local start
hello world

Namun, saya tidak percaya itu dirujuk oleh apa pun di /etc/initdirektori pemula (bukan init.d!):

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

Ada beberapa layanan "rc" di pemula:

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

Tapi sepertinya tidak ada yang berhubungan dengan rc.local.

goldilocks
sumber
5

Ini lebih merupakan hal khusus distribusi. (seperti, Anda tidak akan menemukan rc.local berbeda di CentOS).

Sekarang datang ke pertanyaan Anda yang sebenarnya, saya pikir menambahkan apa pun di dalam /etc/init.d/rc.local membuatnya untuk memulai sebagai "layanan" sedangkan, apa pun di dalam /etc/rc.local hanya akan meluncurkan skrip itu pada saat boot.

Saya tidak begitu yakin mengapa Ubuntu masih mempertahankan keduanya? (Mungkin orang lain mungkin menjelaskan bagian ini !!)

pragmatis
sumber
Apa perbedaan antara perintah yang dijalankan "sebagai layanan" dan kode yang "hanya diluncurkan saat boot"? Apakah ini keamanan atau apa?
grigoryvp
Perbedaan inti antara keduanya pada dasarnya adalah Layanan dan proses. ;) Saya kira maksud dasarnya adalah keamanan saja. Anda mungkin menemukan tautan ini menarik: unixmen.com/managing-your-services-and-processes-in-linux
pragmatic
Ini salah! Mereka bukan skrip yang sama, tetapi mereka adalah satu layanan - /etc/init.d/rc.localapakah berhenti memulai hal-hal /etc/rc.local(lihat jawaban saya untuk lebih jelasnya).
goldilocks
@goldilocks: Terima kasih atas jawaban yang sangat deskriptif dan menyeluruh tetapi saya tidak jelas bagian mana dari jawaban saya yang Anda sebutkan salah? Mengatakan satu sebagai layanan berarti dapat melakukan hal-hal "mulai" dan "hentikan", sementara yang lain hanya sebagai proses. Harap perbaiki saya jika saya tidak masuk akal di sini.
pragmatis
2
@pragmatis Karena /etc/rc.localskrip adalah proses yang dapat dieksekusi diatur oleh /etc/initd/rc.localskrip, sama seperti (misalnya) /bin/syslogakan menjadi proses yang dapat dieksekusi diatur oleh /etc/initd/syslog. Anda mengatakan secara eksplisit bahwa /etc/rc.localitu hanya skrip boot, vs. /etc/initd/rc.localmenjadi layanan run level yang sepenuhnya terpisah.
goldilocks