Standar atau cara terbaik untuk menjaga proses tetap hidup dimulai oleh init.d

13

Saya mencari cara standar atau praktik terbaik untuk menjaga daemon dimulai dengan init.dskrip shell tetap hidup.

Atau bahkan lebih baik, adakah cara untuk mempertahankannya langsung dari /etc/init.d?

Secara khusus, saya memiliki daemon bernama dtnd with dan infinite loop yang mencari proses akhir yang tidak terduga, jika ada, daemon membangunkan mereka lagi. Juga, saya menggunakan alat start-stop-daemon untuk membiarkan presed dijalankan dari pengguna sistem yang diberikan.

Saya ingin menjalankan daemon dtnd ini dari startup. Untuk mencapai perilaku ini, saya membuat skrip init.d yang "membungkus" file dtnd menggunakan perintah start, stop dan status.

Saya punya 2 pertanyaan yang ingin saya pecahkan:

  1. Apakah ada cara untuk tetap mempertahankan beberapa proses dari skrip init.d shell. Apakah praktik standar / cara terbaik?

  2. Dianjurkan untuk menjaga proses tetap hidup dengan loop tak terbatas? Saya kira lebih baik menggunakan beberapa perintah respawnuntuk mencapai itu. Itu benar?

Saya tahu tentang keberadaan respawnperintah. Saya pikir itulah yang saya butuhkan tetapi saya tidak mengerti alur kerja antara /etc/init.d/dan /etc/init. Ada yang bisa bantu saya?

Perhatikan bahwa saya tidak memiliki inittab tidak kaya baru (saya hanya diizinkan untuk digunakan /etc/init, /etc/init.d, crondan alat-alat sistem seperti start-stop-daemon. Maksudku, hanya alat default)

Terima kasih banyak atas waktunya!

Adrian Antunez
sumber

Jawaban:

13

Debian akhirnya akan memiliki systemd, jadi ini adalah cara untuk melakukannya pada sistem Linux yang menggunakan systemd (dan banyak yang sudah melakukannya; Anda mungkin mempertimbangkan untuk berpindah distribusi).

Systemd dapat menangani menjaga layanan tetap hidup untuk Anda secara otomatis; tidak diperlukan alat lain. Cukup pastikan itu Restart=alwaysdiatur di bagian file layanan [Service].

# vi /etc/systemd/system/dtnd.service

[Service]
Restart=always
#...everything else...

Beberapa opsi lain juga tersedia, untuk skenario yang lebih kompleks.

Michael Hampton
sumber
2
Sementara masa depan menunjukkan pilihan yang lebih fleksibel, apakah ini memperhatikan lingkungan / kondisi saat ini? Menginstal alat tampaknya menjadi jalur yang paling tidak tahan dibandingkan dengan perubahan / peningkatan distribusi forklift.
ewwhite
@ewwhite Tergantung. Debian memiliki systemd sejak wheezy, tapi itu bukan init default. Seharusnya default dari jessie. Dan karena pengguna kami menerima jawabannya, saya kira dia sudah menggunakan systemd untuk alasan lain (atau punya izin untuk menginstalnya).
Michael Hampton
systemdtampaknya membuang init.dskrip & basis pada*.service
yurenchen
2
Alih-alih langsung mengedit menggunakan yang lebih aman systemctl edit myservice, lalu systemctl daemon-reloaddan restart layanan saya.
Pablo A
@PabloBianchi Membuat override baik-baik saja jika Anda mengganti unit layanan yang ada. Jika Anda membuat unit dari awal, seperti yang dilakukan OP, maka itu tidak ada gunanya.
Michael Hampton
3

Anda dapat menambahkannya /etc/inittabdengan respawn:

d1:2345:respawn:/path/to/your/first_daemon arg1 arg2
d2:2345:respawn:/path/to/your/second_daemon arg1 arg2

Ini peretasan yang kotor, tapi saya pernah menggunakannya dengan sukses pada sistem sysv-init lama.

Dennis Kaarsemaker
sumber
Tapi jangan daemon cal setid () dan fork () dijalankan secara normal di latar belakang?
symcbean
Terima kasih! Seperti yang Anda katakan itu adalah hack yang kotor tetapi berhasil. Lagi pula saya lebih suka penggunaan systemd. Sekarang saya tahu tentang keberadaannya.
Adrian Antunez
Ini tidak berfungsi pada RHEL6. Utilitas respawn sepertinya tidak tersedia.
Djidiouf
2

Nah, itulah salah satu alasan utama, mengapa debian pindah ke systemd.

sysvinit (/etc/init.d) tidak dapat mendeteksi, jika layanan tidak aktif / tidak merespons. Ini berarti Anda harus memantau layanan ini dan meningkat jika layanan tidak akan melakukan pekerjaannya lagi.

mungkin hal termudah untuk dilakukan adalah bermigrasi ke daemonhandler lain seperti systemd (default di RHEL7, akan menjadi default di debian dan ubuntu lts berikutnya), pemula (default di RHEL6, Ubuntu 12.04 dan 14.04), daemontools (seperti disebutkan, dikembangkan oleh djb) atau yang lainnya.

melakukan pekerjaan mempertahankan layanan tetap hidup adalah PITA di sysvinit.

janaurka
sumber
1

Praktik terbaik adalah memastikan bahwa dasmon Anda TIDAK BERHENTI sejak awal.

Gagal Anda mungkin ingin melihat daemontools DJB

symcbean
sumber
3
Tentu saja praktik terbaik adalah memastikan bahwa dasmon saya tidak berhenti. Tetapi ada banyak aplikasi yang mengikuti pendekatan if-I-stop-wake-me seperti apache2, mysql, samba, pulseaudio ... Saya sudah mencari daemontools dan sepertinya pendekatan yang bagus. Sayangnya, saya tidak diizinkan menginstal alat eksternal. Saya perlu melakukannya dengan menggunakan bash scripting atau start-stop-daemon dan init.d configs.
Adrian Antunez
1

Pendekatan standar bagi saya adalah dengan menggunakan utilitas Monit untuk ini.

Saya tidak tahu dari deskripsi Anda jika Anda telah menulis sesuatu seperti Monit dan berusaha memastikan itu berjalan, atau jika Anda perlu sesuatu untuk menonton daemon yang Anda buat.

putih
sumber
1
Hai ya, saya harus memastikan aplikasi saya berfungsi. Sayangnya, saya tidak diizinkan menginstal alat eksternal. Saya perlu melakukannya dengan menggunakan bash scripting atau start-stop-daemon dan init.d configs.
Adrian Antunez
2
@ AdriánAntúnez Jika Anda tidak diizinkan menginstal alat yang Anda butuhkan untuk melakukan pekerjaan Anda, Anda harus segera memperbaiki masalah itu.
Michael Hampton
@ AdriánAntúnez Anda meminta "standar". Monit cukup terkenal / terkenal. Anda meminta "yang terbaik" ... Kendala Anda lebih bersifat politis. Mengapa Anda tidak diizinkan menginstal perangkat lunak?
ewwhite
1
Ini bukan alat atau ketergantungan yang tidak perlu jika melakukan apa yang Anda inginkan .
ewwhite
1
@white Maaf, maksud saya menghindari ketergantungan alat eksternal.
Adrian Antunez