Menjalankan skrip selama booting / startup; init.d vs cron @reboot

48

Saat ini saya mencoba memahami perbedaan antara init.ddan cron @rebootuntuk menjalankan skrip saat startup / boot sistem.

Penggunaan @reboot(metode ini disebutkan dalam forum ini oleh hs.chandra ) adalah beberapa yang lebih sederhana, hanya dengan masuk crontab -edan membuat @reboot /some_directory/to_your/script/your_script.txtdan kemudian your_script.txtakan dieksekusi setiap kali sistem di-boot ulang. Penjelasan mendalam @rebootada di sini

Atau dengan menanamkan /etc/init.d/your_script.txtke dalam baris kedua skrip Anda yaitu:

#!/bin/bash
# /etc/init.d/your_script.txt

Anda dapat menjalankan chmod +x /etc/init.d/your_script.txtdan itu juga harus menghasilkan untuk your_script.txtmenjalankan setiap kali sistem di-boot.

T1: Apa perbedaan utama antara keduanya?
T2: Mana yang lebih kuat?
T3: Apakah ada yang lebih baik dari keduanya?
T4: Apakah ini cara yang benar untuk menyematkan skrip untuk dijalankan saat boot?

Saya akan memasukkan file .sh bash untuk dijalankan saat startup.

3kstc
sumber
2
Juga relevan adalah systemd, link1 link2
Rufus

Jawaban:

37

init.d, Juga dikenal sebagai skrip SysV, dimaksudkan untuk memulai dan menghentikan layanan selama inisialisasi dan penutupan sistem. ( /etc/init.d/skrip juga dijalankan pada sistem yang diaktifkan sistem untuk kompatibilitas).

  • Script dieksekusi selama boot dan shutdown (secara default).
  • Skrip harus berupa skrip init.d, bukan hanya skrip. Ini harus mendukung startdan stopdan lebih (lihat kebijakan Debian )
  • Script dapat dijalankan selama boot sistem (Anda dapat menentukan kapan).

crontab(dan karenanya @reboot).

  • cron akan menjalankan perintah atau skrip biasa, tidak ada yang istimewa di sini.
  • setiap pengguna dapat menambahkan @rebootskrip (bukan hanya root)
  • pada sistem Debian dengan systemd: @reboot cron dieksekusi selama multi-user.target.
  • pada sistem Debian dengan SysV (bukan systemd), crontab (5) menyebutkan: Harap perhatikan bahwa startup, sejauh menyangkut @reboot, adalah saat ketika daemon cron (8) memulai. Secara khusus, mungkin sebelum beberapa daemon sistem, atau fasilitas lainnya, adalah startup. Ini karena urutan urutan boot mesin.
  • mudah untuk menjadwalkan skrip yang sama saat boot dan secara berkala.

/etc/rc.localsering dianggap jelek atau usang (setidaknya oleh redhat ), masih memiliki beberapa fitur bagus:

  • rc.local akan menjalankan perintah atau skrip biasa, tidak ada yang istimewa di sini.
  • pada sistem Debian dengan SysV (bukan systemd): rc.localadalah (hampir) layanan terakhir yang dimulai.
  • tetapi pada sistem Debian dengan systemd: rc.localdieksekusi setelah network.targetsecara default (tidak network-online.target!)

Mengenai systemd network.targetdan network-online.target, baca Menjalankan Layanan Setelah Jaringan menyala .

Franklin Piat
sumber
Di Ununtu 16.04 saya, saya harus menghapus /var/run/crond.rebootfile setiap kali, jika saya ingin pekerjaan cron @reboot dieksekusi setiap kali sistem dinyalakan. Jika file ini ada, maka @reboot cron jobs tidak akan dieksekusi
Albert Català
@ Albert-Catala kirimkan bug ke Ubuntu!
Franklin Piat
12

Pertama, klarifikasi adalah dalam urutan:

  • init.d adalah direktori yang menyimpan skrip kontrol layanan, yang mengontrol awal dan penghentian layanan seperti httpdataucron
  • rc.local adalah layanan yang memungkinkan menjalankan skrip sewenang-wenang sebagai bagian dari proses startup sistem

Dalam hal apakah lebih baik menggunakan rc.localatau cronmenjalankan skrip Anda, saya menduga itu lebih merupakan masalah estetika daripada kepraktisan. cron, sebagai penjadwal tugas, dimaksudkan sebagai metode untuk melakukan perawatan atau pemeliharaan mesin, seperti memeriksa pembaruan, membersihkan cache, atau melakukan audit keamanan. Ini tidak berarti bahwa itu terbatas untuk melakukan fungsi-fungsi itu, karena dapat menjalankan skrip atau perintah yang diinginkan pada waktu yang ditentukan (seperti @reboot).

Penggunaan rc.local, di sisi lain, akan jatuh lebih dalam jenis konfigurasi sistem tugas, karena rc.local, dieksekusi oleh sistem init mesin, biasanya bertanggung jawab untuk mengatur konfigurasi jaringan mesin, layanan atau lingkungan (tetapi sekali lagi, tidak terbatas hanya pada tugas ini).

Kedua poin ini, bagaimanapun, harus marah dengan fakta bahwa tidak semua sistem init menawarkan rc.localmekanisme, dan tidak semua daemon cron menawarkan @reboottag psuedo.

Poin Bonus

Seperti disebutkan, init.dadalah direktori yang berisi skrip yang mengontrol layanan yang dapat dimulai atau dihentikan pada sistem Anda (setidaknya pada mesin yang menggunakan SysVtipe init system). Bergantung pada sistem init Anda dan tujuan skrip Anda, mungkin masuk akal untuk mengubah skrip Anda menjadi skrip init untuk dijalankan dengan cara yang sama seperti layanan. Ini, bagaimanapun, sangat tergantung pada sistem init Anda karena kerangka di sekitar bagaimana file ini dibangun dapat sangat berbeda.

Kata terakhir

Perlu juga dicatat bahwa biasanya skrip bash diakhiri dengan akhiran .shbukan .txt, karena ini langsung menunjukkan file adalah skrip shell, bukan file teks. Yang sedang berkata, asalkan itu memiliki shebang ( #!/bin/bash) di bagian atas file, atau disebut sebagai bash /path/to/script.whatever, seharusnya tidak masalah dalam hal mengeksekusi skrip.

Wraeth
sumber
bashskrip biasanya tidak (dan bisa dibilang tidak boleh) diakhiri dengan shekstensi.
mikeserv
1
@ mikeserv: Walaupun saya setuju bahwa sebagian besar skrip bash tidak (dan mungkin tidak boleh) memiliki ekstensi apa pun, biasanya file dengan ekstensi ".sh" adalah skrip bash - lihat "Apa itu file .sh?" .
David Cary
@ DavidCary - yang sepertinya bukan sumber yang sangat otoritatif.
mikeserv
1
Wikipedia: "daftar ekstensi nama file" dan Wikipedia: "skrip shell" juga menyebutkan ekstensi ".sh" yang sangat umum, dengan referensi.
David Cary
1
" biasanya skrip bash diakhiri dengan akhiran .shbukan.txt " - secara khusus artinya shlebih akurat sebagai ekstensi nama file untuk skrip bash (atau skrip shell lainnya) daripada txtyang biasanya menunjukkan teks biasa. Anda dapat menggunakan ekstensi apa pun yang membuat Anda tertawa, tetapi konvensi umum adalah, jika menggunakan ekstensi shakan lebih tepat dan biasanya digunakan; meskipun tidak diperlukan, terutama untuk skrip yang dimaksudkan untuk dieksekusi dari PATH.
Wraeth
3

Saya menulis jawaban saya di bawah ini;

T1: Apa perbedaan utama antara keduanya?

Terlepas dari perbedaan yang disebutkan oleh pengguna lain di atas, saya ingin menyoroti titik bahwa @reboot bergantung pada daemon crond. Anda bergantung pada urutan awal mulai. Meskipun sebagian besar kasus, crond dimulai dengan baik tetapi kadang-kadang gagal untuk memulai (setidaknya saya telah melihat beberapa kegagalan dalam beberapa proyek saya). Saat Anda menulis skrip init, kegagalan biasanya akan terjadi jika Anda melakukan kesalahan pada skrip Anda (contoh: mengandalkan layanan yang akan dimulai setelah layanan Anda)

T2: Mana yang lebih kuat?

Berdasarkan di atas, saya pikir init lebih kuat. Tetapi ada poin lain seperti yang disebutkan oleh "Franklin Piat" dalam jawaban pertama. Biasanya Anda memerlukan skrip init untuk daemon dan Anda harus mengikuti kebijakan

T3: Apakah ada yang lebih baik dari keduanya?

Saya tidak berpikir begitu (rc.local agak tua dan usang)

T4: Apakah ini cara yang benar untuk menyematkan skrip untuk dijalankan saat boot?

Iya. Biasanya penulis aplikasi / paket melakukan dengan cara ini.

shubham
sumber