skrip init.d ditulis dengan Python

10

Sebuah pertanyaan muncul di StackOverflow yang menanyakan tentang penulisan init.dskrip dengan Python. Satu komentar menunjukkan bahwa skrip ini harus diprogram dalam shell, bukan Python. Apakah menulis init.dskrip dengan Python:

  1. Buruk. Buruk. Buruk. Tidak pernah melakukan ini.
  2. Bukan praktik yang disarankan.
  3. OK, dengan peringatan.
  4. Dogma warisan.
  5. Benar-benar baik-baik saja.

Akan sangat bagus untuk mengetahui skenario mimpi buruk, atau jika aturan ini ditulis dalam darah sysadmin.

mjhm
sumber

Jawaban:

9

Saya akan mengatakan # 2, tetapi sangat dekat dengan # 1 - "Buruk. Buruk. Buruk. Tidak pernah melakukan ini." Standar, seperti itu, untuk skrip init Linux ada di LSB , dan sementara itu tidak pernah keluar dan mengatakan "ini adalah skrip bourne shell", beberapa asumsi dibuat. Satu, bahwa baris yang dimulai dengan # adalah komentar, terjadi dengan baik. Lebih bermasalah adalah persyaratan bahwa skrip init mengeksekusi perintah dari /lib/lsb/init-functions"di lingkungan saat ini (lihat shell command built-in command dot)".

Tetapi yang lebih penting, jika Anda melakukan sesuatu yang sangat rumit di sini, Anda salah melakukannya. Skrip init harus sangat sederhana dan utilitarian. Seharusnya skrip dalam arti klasik, bukan program. Lebih baik menghisapnya dan membuat skrip shell sederhana agar sysadmin mana saja dapat dengan mudah melakukan grok dalam satu tampilan cepat daripada membuat sesuatu yang indah dan direkayasa dengan Python.

Pertimbangan lain yang perlu diingat adalah systemd, yang mungkin atau tidak mungkin Masa Depan Dari Semua Inisialisasi Sistem Di Linux. Di bawah systemd, inisialisasi dilakukan oleh file konfigurasi sederhana daripada skrip, idenya adalah bahwa semua startup cocok dengan beberapa pola desain standar dan benar-benar Anda hanya harus memilih satu. Jika program Anda menggunakan sesuatu yang rumit untuk inisialisasi, itu harus keluar dari skrip init itu sendiri.

mattdm
sumber
1
Saya akan menjawab ini. Intinya adalah bahwa Python tidak perlu dan tidak standar, dan karena itu dapat membuat titik tambahan untuk men-debug ketidakpastian dan titik kegagalan tambahan. Mengacu pada pertanyaan SO asli, saya mengumpulkan bahwa skrip tersebut dapat meluncurkan daemon, tetapi mereka seharusnya tidak menjadi daemon yang sebenarnya.
mjhm
jika saya ingat, tidak semua distro mengikuti LSB. lihat debian.
Massimo
10

Saya tidak melihat masalah dengan itu, jika Anda tahu, pasti, bahwa juru bahasa Python akan tersedia ketika skrip init.d sedang dijalankan. Ini, bagi saya, menunjukkan bahwa Anda sedang melihat sesuatu yang dilakukan relatif terlambat di level run multi-user (atau "konsol grafis").

Namun ... Ini berarti bahwa versi tertentu dari juru bahasa Python MUNGKIN penting untuk urutan boot Anda dan ini adalah satu lagi yang perlu Anda periksa saat upgrade.

Saya kira ini berarti saya mengatakan "3. OK, dengan peringatan".

Vatine
sumber
4
+1. Persis seperti yang saya tulis. Satu-satunya "masalah" di sini adalah memastikan Anda menyesuaikan diri dengan LSB, (mis. Menyediakan fungsi yang diperlukan) dan memastikan penerjemah python yang Anda butuhkan tersedia saat runtime (dan tidak rusak.)
Sam Halicke
3
Tersedia saat runtime mungkin rumit jika pengguna memilih untuk memiliki / usr pada partisi yang terpisah. Penting bahwa skrip Anda dijalankan setelah / usr di-mount karena python biasanya dipasang di / usr.
Zoredache
@Zoredache - Ayup. Biasanya, Anda tahu bahwa "telah terjadi" ketika Anda terlambat dalam urutan RC "multi-pengguna".
Vatine
2

Saya setuju dengan "3. Oke, dengan peringatan," tetapi untuk alasan yang berbeda. Pengalaman saya di Solaris adalah bahwa mereka memiliki salinan OS dari Perl untuk beberapa program internal mereka. Script shell tidak lebih dari shell untuk membuat Perl memulai. Apakah skrip startup harus ditulis dalam sh? Tidak, tetapi ini meningkatkan rawatan bagi administrator. Dan skrip init tidak melakukan hal yang lebih rumit seperti daemon --startatau daemon --stop. Jika Anda melakukan ini, maka pengguna biasa dapat memulai alat Anda dalam mode tidakrivil, jika itu masuk akal dalam konteks program Anda. Dan mereka tidak perlu memiliki segala macam pengaturan rumit untuk kemahiran.

Distribusi Linux modern, bahkan yang masih menggunakan init.d, memiliki banyak koleksi fungsi pre-built yang dimaksudkan untuk memudahkan mengelola daemon. Proses boot grafis secara rutin memanfaatkan fungsi-fungsi itu untuk menjaga logo cantik tetap ada kecuali salah satu skrip startup mulai memuntahkan kesalahan. Kode Python Anda (atau bahasa lain) mungkin tidak cocok dengan skema itu.

Jika Anda tidak peduli dengan estetika atau perawatan, skrip init Anda dapat ditulis sesuka Anda. Saya telah melihat banyak admin, yang bahkan tidak dapat memotong dan menempel dengan benar, sepenuhnya mengabaikan argumen baris perintah dan mereka baru saja memulai daemon. Tidak ada shutdown, status, atau restart. Itu belum matang, tetapi kode mereka masih berjalan.

zerolagtime
sumber
1

Saya katakan antara # 1-2. LSB mengarahkan Anda dengan cara ini .. dan dari Sys-Admin (peran non dev) tugas tersebut menentukan pengetahuan sh / bash, BUKAN level dev (atau bahkan pemahaman ringan) tentang python, PHP, atau perl. Itu untuk tumpukan LAMP, bukan untuk skrip init sistem.

Tweeks
sumber