Bagaimana saya bisa membuat skrip di /etc/init.d mulai saat boot?

83

Saya pikir saya membaca sesuatu beberapa waktu lalu tentang ini, tetapi saya tidak ingat bagaimana hal itu dilakukan. Pada dasarnya, saya memiliki layanan di /etc/init.dmana saya ingin memulai secara otomatis saat boot. Saya ingat itu ada hubungannya dengan menghubungkan skrip ke dalam /etc/rc.ddirektori, tapi saya tidak ingat saat ini. Apa perintah untuk ini?

Saya percaya saya menggunakan turunan Fedora / CentOS.

Naftuli Kay
sumber
Itu tergantung pada OS Anda. Apa varian unix yang Anda jalankan, dan jika Linux, distribusi apa? Yang antara /etc/init, /etc/init.d, /etc/rc.d, /etc/rc.localdan beberapa lagi yang dimilikinya?
Gilles
1
Saya pikir saya menggunakan CentOS atau semacamnya. Apakah jawabannya berbeda untuk Debian? Saya tertarik pada solusi untuk Debian juga.
Naftuli Kay

Jawaban:

109

Jika Anda menggunakan sistem berbasis Red Hat, seperti yang Anda sebutkan, Anda dapat melakukan hal berikut:

  1. Buat skrip dan tempat di /etc/init.d(misalnya /etc/init.d/myscript). Script harus memiliki format berikut:
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

Formatnya cukup standar dan Anda dapat melihat skrip yang ada di /etc/init.d. Anda kemudian dapat menggunakan skrip seperti begitu /etc/init.d/myscript startatau chkconfig myscript start. The ckconfighalaman manual menjelaskan header dari script:

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.

Contoh mulai, berhenti dan kode status menggunakan fungsi pembantu yang didefinisikan dalam /etc/init.d/functions

  1. Aktifkan skrip

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. Periksa skrip memang diaktifkan - Anda akan melihat "pada" untuk tingkat yang Anda pilih.

    $ chkconfig --list | grep myscript
    
canen
sumber
3
Chkconfig adalah yang Anda inginkan. +1
whoami
Mengapa init memulai sesuatu di runlevel 2, 3, 4 dan 5? Tidakkah Anda harus berhati-hati untuk menghindari memulai server di runlevel 2? Dan runlevel 4 tidak didefinisikan pada RHEL, jadi mengapa mencoba memulainya di runlevel itu? Bukan kritik, hanya ingin tahu. Saya adalah pengguna Slackware asli.
Bruce Ediger
4 tidak didefinisikan pada RHEL, tetapi memang ada. Anda bisa mencurinya untuk barang-barang Anda sendiri.
Kevin M
Header diambil dari halaman manual chkconfig. Saya pribadi tetap dengan 235 atau hanya 35 dalam banyak kasus.
canen
Apakah ada log yang bisa saya lihat jika ada yang gagal memulai saat startup?
Utkarsh Sinha
10

Anda menguji, apa runlevel mesin Anda biasanya mulai.

runlevel

Seringkali ini 5 atau 2 - ada berbagai konvensi, tetapi tidak ada yang benar-benar ditetapkan, afaik. Ubuntu menggunakan 2, sedangkan distribusi sebelumnya yang saya gunakan selalu digunakan

  • 1 pengguna tunggal (pengguna super)
  • 2 multi pengguna
  • 3 multi-user + jaringan
  • 4 tidak digunakan / dapat didefinisikan pengguna
  • 5 multi pengguna, jaringan + X11

Kemudian Anda membuat symlink dari init-script Anda, mungkin /etc/init.d/foobarke/etc/rc2.d/SXYfoobar

S berarti 'Mulai skrip ini di runlevel ini (di sini: 2). XY adalah angka desimal dua digit, yang relevan untuk urutan, skrip dimulai.

Jika Anda bergantung pada skrip S45barfoo untuk dijalankan sebelum Anda, dan S55foofoo bergantung pada skrip Anda, Anda akan memilih xy antara 45 dan 55. Untuk angka yang sama urutan boot tidak ditentukan.

Sementara Ubuntu beralih (beralih) ke prosedur startup lain, disebut upstart.

Dan perhatikan: Tidak selalu tautan tautan ke /etc/rcX.d- kadang-kadang itu /etc/init/rcX.datau sesuatu yang serupa, tetapi harus mudah ditemukan, di suatu tempat di bawah / etc.

Jika Anda ingin memulai sesuatu di akhir skrip mulai, /etc/rc.localakan menjadi file yang harus dicari, tetapi jika itu tergantung pada X11 sudah berjalan, Anda mungkin mencari opsi autostart dari lingkungan desktop Anda, atau /etc/X11/Xsession.d/dengan pola yang sama seperti yang dijelaskan atas.

Jika Anda bergantung pada jaringan yang berada di atas, ada direktori terpisah (if-up.d), dan untuk perangkat yang dipasang seperti USB-drive eksternal /etc/udev/rules.d/.

Pengguna tidak diketahui
sumber
Apakah tidak ada perintah yang melakukan symlinking untuk Anda? Saya pikir saya ingat sesuatu seperti itu.
Naftuli Kay
1
Bukan update-rc.d?
Naftuli Kay
GUI atau commandline? DE Anda mungkin menyediakan alat untuk menandai runlevel, tempat memulai atau menghentikan skrip Anda. Saya pernah melihat sesuatu seperti itu, tetapi tidak ingat nama, dan bagaimana menentukan angka (xy).
pengguna tidak diketahui
Garis komando. Ini menangani symlinking untuk Anda dan memungkinkan Anda untuk membalik sakelar pada apakah skrip tertentu berjalan atau tidak.
Naftuli Kay
3

Seperti yang ditanyakan Naftuli Tzvi Kay tentang Debian di atas: Dimulai dengan Debian 6, skrip Anda harus berisi tajuk LSB (Linux Standards Base) yang menunjukkan dependensi dan kemampuannya ( lihat halaman wiki debian ).

Jika ada header LSB, Anda dapat menggunakan insservuntuk memasukkan skrip Anda dalam proses boot ( lihat halaman wiki debian lain ).

mdt
sumber