Bagaimana cara menjalankan skrip shell saat startup?

13

Saya telah membuat skrip untuk memulai server (pertanyaan pertama saya). Sekarang saya ingin menjalankannya pada boot sistem dan memulai server yang ditentukan. Apa yang harus saya lakukan untuk menyelesaikan ini?

Temuan saya memberitahu saya meletakkan file ini di /etc/init.dlokasi, dan itu akan dieksekusi ketika sistem akan boot. Tapi saya tidak bisa mengerti bagaimana argumen pertama tentang startup itu start? Adalah suatu tempat yang telah ditetapkan ini untuk digunakan startsebagai $1? Jika saya ingin memiliki kasing startallyang akan memulai semua server dalam skrip, lalu opsi apa yang bisa saya kelola?

Script saya seperti ini:

#!/bin/bash

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

restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart)"
;;
esac
vijay.shad
sumber
Saya tahu ini sudah tua ... tetapi shellnya harus '#! / Bin / sh' not '#! / Bin / bash' / bin / sh lebih mungkin bekerja dalam kasus mesin yang memiliki masalah saat startup (mis. / usr / lib tidak bisa dipasang)
Rich Homolka

Jawaban:

19

/etc/init.dadalah direktori skrip, tempat skrip yang dapat dieksekusi muncul. Namun, untuk menjalankan skrip dalam urutan tertentu setelah sistem Anda mulai, Anda perlu menambahkan file ke /etc/rc#.ddirektori. Entri yang muncul di sini memberi tahu sistem Anda dalam urutan apa dan pada level apa skrip /etc/init.drun harus dijalankan. Angka setelah rc mengindikasikan level run yang dijalankan mesin, sesuai dengan bagan ini:

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

Jadi, jika Anda memiliki:

/etc/init.d/importantscript

Maka Anda memerlukan file (kosong):

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

S berarti mulai, dan K berarti membunuh. Ketika mesin Anda mulai, sistem akan mengatakan "Ah, saya menjalankan di RunLevel 3, mari kita mampir ke rc3.d untuk melihat skrip apa dalam '/etc/init.d' yang perlu dijalankan dan dalam urutan apa." Dalam hal ini, sistem akan mengurutkan berdasarkan 'S' dan kemudian nomor setelah 'S' dan akan menjalankan '/etc/init.d/importantscript start'. 20 hanya untuk tujuan pemesanan ... skrip Anda akan berjalan di belakang 'S19' dan di depan 'S21'. Anda dapat membuat file-file ini hanya dengan melakukan:

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

Berikut ini ringkasan yang bagus: http://www.linux.com/news/enterprise/systems-management/8116-an-introduction-to-services-runlevels-and-rcd-scripts

aronchick
sumber
bukankah lebih umum untuk "ln -s /etc/init.d/script" ke rcX.d / *?
Ozma
8

Anda tidak harus --- dan tidak seharusnya --- membuat file di /etc/rc.d/rcN.d/; apa yang harus Anda lakukan adalah meletakkan komentar di skrip init Anda

# chkconfig NNN A B

di mana NNNadalah himpunan runlevel di mana Anda ingin script aktif (misalnya, 345jika itu aktif dalam runlevel 3, 4dan 5), dan Adan Badalah awal dan berhenti prioritas. Kemudian chkconfig --add foo(dengan asumsi skrip Anda dinamai foo) akan membuat file /etc/rc.d/rcN.d/dengan nama yang sesuai.

Anda kemudian dapat menggunakan service foo baruntuk mengirim barpesan ke skrip Anda (mis start. stop,, Apa pun - dari sanalah Anda $1berasal).

Peter
sumber
0

$ 1 adalah argumen baris perintah yang diteruskan ke skrip Anda, itu adalah salah satu dari mulai, berhenti atau mulai ulang. Di openSUSE , saya tidak ingat memiliki opsi untuk meneruskan argumen lain ke dalam skrip ketika menggunakan editor runlevel, jadi saya pikir ini mungkin satu-satunya yang harus Anda gunakan.

Saya tidak menggunakan CentOS sendiri, tetapi tampaknya program untuk mengontrol apa yang dimulai di mana runlevel adalah ntsysv .

Neal
sumber