Tujuan dan penggunaan khas /etc/rc.local

73

Headernya terlihat seperti ini:

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

Apa alasan file ini (tidak banyak mengandung), dan perintah apa yang biasanya Anda masukkan ke dalamnya? Apa itu "multiuser runlevel"? (Saya kira rc"jalankan perintah"?)

Emanuel Berg
sumber
2
Saya tidak tahu apakah ini tujuan file "resmi", tetapi saya tahu bahwa saya dapat menggunakan file untuk apa yang seharusnya terjadi pada startup, dan akan memerlukan akses pengguna super, tetapi tanpa harus memberikan kata sandi. Itu biasanya akan melibatkan warna, keyboard, dan hal-hal lain semacam itu. Lihat beberapa contoh di sini .
Emanuel Berg

Jawaban:

66

Sebuah runlevel adalah keadaan sistem, menunjukkan apakah itu dalam proses booting atau reboot atau mematikan, atau dalam mode single-user, atau berjalan normal. Program init tradisional menangani tindakan ini dengan beralih ke runlevel yang sesuai. Di Linux, runlevel berdasarkan konvensi :

  • S saat booting,
  • 0 saat mematikan,
  • 6 saat me-reboot,
  • 1 dalam mode pengguna tunggal dan
  • 2 hingga 5 dalam operasi normal.

Runlevel 2 hingga 5 dikenal sebagai runlevel multi-pengguna karena memungkinkan beberapa pengguna untuk masuk, tidak seperti runlevel 1 yang hanya ditujukan untuk administrator sistem.

Ketika perubahan runlevel, init menjalankan skrip rc (pada sistem dengan init tradisional - ada alternatif, seperti Upstart dan systemd ). Script rc ini biasanya memulai dan menghentikan layanan sistem, dan disediakan oleh distribusi.

Skrip /etc/rc.localini untuk digunakan oleh administrator sistem. Ini secara tradisional dijalankan setelah semua layanan sistem normal dimulai, pada akhir proses beralih ke runlevel multiuser. Anda dapat menggunakannya untuk memulai layanan kustom, misalnya server yang diinstal /usr/local. Sebagian besar instalasi tidak perlu /etc/rc.local, itu disediakan untuk sebagian kecil kasus di mana itu diperlukan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Saya mengetahui hari ini bahwa pada FreeBSD saat ini, rc.local dapat dijalankan cukup awal. Jelas tidak setelah semua layanan sistem normal dimulai. Saya ingin bunyi bip ketika akses sshd ke mesin tanpa kepala akan tersedia, dan rc.localtidak cocok untuk alasan ini. Karena pertanyaan aslinya adalah tentang Debian, komentar ini mungkin tidak relevan untuk OP.
MvG
1
@ MVG Terima kasih atas informasinya. rc.localsecara tradisional dijalankan terakhir, tetapi saya melihat bahwa FreeBSD berhenti melakukan itu ketika mereka beralih ke sistem berbasis ketergantungan. Pikiran Anda, bahkan jika rc.localdipanggil setelah itu /etc/rc.d/sshd, itu tidak akan berfungsi dengan baik: rc.localakan dipanggil segera setelah sshdproses dimulai, itu bisa dipanggil sebelum sshdmulai mendengarkan jaringan (tapi kami akan berbicara sepersepuluh detik di paling dalam pengaturan khas).
Gilles 'SO- stop being evil'
Saya mencoba menggunakannya untuk mengatur jaringan untuk kontainer LXC dan secara otomatis memulai mereka. Tapi itu berhenti setelah itu iptables-apply /root/iptables. Saya sedang dalam proses mencari tahu apa yang salah (menunggu reboot berikutnya). Tetapi jika Anda punya saran, saya dengar.
x-yuri
1
@ x-yuri Ini membutuhkan informasi yang jauh lebih banyak daripada yang Anda poskan di sini. Aku bahkan tidak tahu apa itu "itu" berhenti ". Ajukan pertanyaan baru yang menjelaskan apa yang Anda lakukan.
Gilles 'SANGAT berhenti menjadi jahat'
14

rc menunjukkan "run-control",

The multiuserrunlevel akan didefinisikan sebagai tingkat di mana jaringan tersedia dan dengan demikian koneksi ke server dapat dibuat menggunakan layanan tersebut sebagai pengganti koneksi konsol terprogram.

Pikiran Anda, server umumnya dikelola oleh prosesor layanan (dengan berbagai nama) yang mendukung koneksi jaringan dan pada gilirannya bertindak seolah-olah Anda memang memiliki konsol terprogram.

Sedangkan untuk rc.localfile, ini adalah kemudahan untuk memungkinkan Anda menentukan semua objek "lokal" (khusus situs) (daemon dan / atau skrip sekali boot saat boot) yang ingin Anda mulai. Anda dapat memilih untuk menggunakan paradigma ini atau mengisi '/etc/init.d' dengan skrip start / stop dengan tepat.

JRFerguson
sumber
1
Oke, tetapi mengapa file itu ada di sana, dan kapan Anda biasanya menggunakannya, dan bagaimana (misalnya, perintah apa yang masuk akal untuk dimasukkan ke dalamnya)?
Emanuel Berg
4

Saya terutama menggunakannya untuk dua hal:

  1. untuk mencatat tanggal dan versi kernel dari setiap reboot. satu-liner sederhana yang dapat dengan mudah ditambahkan ke sistem tanpa ada isian di sekitar ... dan jauh lebih rentan terhadap sejarah boot yang rusak daripada berjalan uptimed.

  2. untuk menghidupkan kembali direktori lama /etc/rc.boot/ yang dulu berada di debian hingga beberapa tahun yang lalu. Saya masih memiliki beberapa skrip sederhana di sana yang tidak sepadan dengan upaya penulisan ulang sebagai skrip init.d (mis. Skrip Q&P untuk mengirimkan dmesg ke root, dan skrip lain menggunakan hdaparm untuk menonaktifkan spindown idle dan blockdev untuk mengatur read- di depan), dan saya senang mereka dijalankan setelah semua skrip boot-time lainnya.

misalnya

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

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

Juga, saya menulis skrip /etc/rc.local awal tahun ini untuk centos dan distro debian untuk mendapatkan metadata gaya-ec2 dari openstack (on http://169.254.169.254/) sehingga VMs akan mendapatkan IP, hostname, kunci ssh, dan informasi spesifik contoh lainnya . cloud-init sejak itu telah diporting ke distro-distro ini, jadi skripnya sudah usang sekarang.

cas
sumber
3

The rc.localfile di Debian adalah sebagian besar untuk kompatibilitas dengan sistem gaya non-init. Anda seharusnya tidak menggunakannya.

Sebagai gantinya, Anda disarankan /etc/init.d/Skeletonuntuk menyalin ke skrip init baru untuk apa pun yang Anda inginkan terjadi saat mengubah runlevel, kemudian gunakan inservuntuk mengaktifkannya.


Pembaruan: Sesuai komentar di bawah ini, jawaban ini tidak lagi direkomendasikan. Namun, jawaban ini telah diposting beberapa tahun sebelum penghancuran kerangka, dan kerangka itu masih ada di Debian tidak stabil pada Januari 2019.

bahamat
sumber
unix.stackexchange.com/a/480897/5132 /etc/init.d/skeleton bukan jalannya.
JdeBP