Pastikan proses selalu berjalan

23

Saya mulai meng-hosting situs beberapa waktu lalu menggunakan Cherokee. Untuk sumber eksternal (FastCGI, dll) ia memiliki opsi untuk meluncurkan proses jika tidak dapat menemukan satu yang berjalan pada soket atau port yang ditunjuk. Ini bagus karena itu berarti jika PHP atau situs Django jatuh (seperti yang kadang-kadang terjadi) itu restart secara otomatis.

Di server baru menggunakan PHP-FPM saya tidak bisa menggunakan Cherokee (memiliki bug dengan PHP) jadi saya sudah pindah ke NGINX. Saya sangat suka NGINX (untuk gaya konfigurasi) tetapi saya mengalami masalah serius dengan proses jatuh dan tidak pernah respawning. PHP melakukan hal ini kadang-kadang tetapi situs Django lebih merupakan masalah. Saya telah membuat skrip init untuk mereka dan mereka muncul saat boot tetapi ini tidak membantu saya jika mereka masuk di antara reboot.

Saya kira saya sedang mencari proxy FastCGI. Sesuatu yang, seperti Cherokee, tahu proses apa yang harus berjalan pada soket / port mana dan meresponsnya sesuai permintaan. Apakah hal semacam itu ada? Apakah ada cara untuk membangun ini ke NGINX (untuk kemudahan konfigurasi)?

Oli
sumber

Jawaban:

13

Bagaimana dengan daemontools dan khususnya alat pengawas

awasi monitor suatu layanan. Ini memulai layanan dan memulai kembali layanan jika mati. Menyiapkan layanan baru itu mudah: semua kebutuhan pengawasan adalah direktori dengan skrip yang menjalankan layanan.

Murilo
sumber
+1 untuk daemontools. Namun, Anda sering tidak bisa begitu saja melempar skrip /etc/init.d/apachectlke dalamnya. Anda sering harus menulis ulang skrip startup sederhana Anda sendiri untuk digunakan exec. Meskipun saya akan senang melihat beberapa contoh menggunakan daemontools
Stefan Lasiewski
daemontools memiliki inkarnasi lain sebagai runit. Tidak begitu penting sekarang bahwa daemontools adalah domain publik, tetapi distro yang lebih lama mungkin hanya memiliki runit.
camh
8

respawn di inittab

Stephen Jazdzewski
sumber
5

Saya daemontoolsmenyarankan kedua , tetapi jika Anda tidak suka cara kerja perangkat lunak DJB (untuk alasan apa pun), ada juga supervisord.

Saya membuat gambar FreeBSD beberapa waktu lalu yang dulu supervisordmengelola nginxdan gunicorn, yang saya gunakan untuk meng-host beberapa aplikasi WSGI sederhana, dan seluruh prosesnya cukup mudah.

Jika Anda melakukan ini untuk Django, Gunicorn membuatnya sangat mudah untuk menyebarkan aplikasi Django, btw. Lihat posting blog ini untuk lebih jelasnya.

Hank Gay
sumber
4

Pilihan lain bisa menggunakan monit , yang biasanya saya gunakan.


sumber
3

Sudahkah Anda mempertimbangkan god?

Tuhan itu mudah dikonfigurasikan, mudah untuk memperpanjang kerangka pemantauan yang ditulis dalam Ruby.

Menjaga proses dan tugas server Anda harus menjadi bagian sederhana dari proses penerapan Anda. Tuhan bertujuan untuk menjadi aplikasi pemantauan paling sederhana, paling kuat yang tersedia.

Saya menggunakannya untuk memastikan bahwa jika instance Rails / nginx jatuh, mereka dihidupkan kembali, dan meskipun saya tidak melihat dibangun dalam dukungan untuk memeriksa apakah itu menggunakan port yang tepat atau tidak, tetapi jika masalahnya adalah bahwa proses gagal atau tidak lagi berjalan, Anda tidak bisa salah god.

Chris Bunch
sumber
0

Solusi hackish adalah meluncurkan skrip (via cron) secara berkala yang mendeteksi jika prosesnya mati, dan dalam hal ini meluncurkannya kembali.

Robert Swisher
sumber
0

Ada berbagai cara untuk me-restart daemon yang gagal, rekomendasi yang biasa adalah "respawn in inabab" tetapi dengan beberapa pertimbangan batasan jika mesin benar-benar kacau.

Daemon pengawas juga dapat memantau proses melalui file PID-nya. Namun, itu seharusnya hanya dianggap sebagai garis pertahanan sekunder untuk me-reboot mesin yang terlalu sakit untuk berjalan dengan baik (mis. Kehabisan memori, percabangan garpu, dll), dan bukan sebagai cara utama atau memantau dan memulai kembali daemon.

Terakhir, Anda dapat mempertimbangkan pemantauan sistem yang rumit menggunakan nagios untuk memberikan pandangan global kepada administrator. Itu dapat menjalankan plug-in untuk menyelidiki operasi daemon secara eksternal, yang merupakan tes yang lebih lengkap dari fungsinya yang hanya menjalankan PID.

Paul Crawford
sumber
-1

Jawaban sederhana - mulai, tulis pid Anda di suatu tempat, dan setiap kali x (detik, menit, taruhan Anda) memeriksa apakah prosesnya sudah selesai.

Jawaban panjang - semua hal di atas adalah metode yang baik. Namun agak rumit.

Juga perlu diingat bahwa menjadi hidup dan menjawab permintaan adalah hal yang berbeda.

lucabotti
sumber
1
... dan silangkan jari Anda dan berharap tidak ada yang mencorat-coret file PID, atau menghapusnya, atau menggunakannya kembali untuk daemon yang berbeda, atau menunjukkannya kembali pada beberapa proses tidak bersalah dan tidak terkait lainnya yang tidak akan bereaksi dengan baik terhadap pemeriksaan karena bangun. ☺ Itulah sebabnya jawaban panjang dari pengawas daemon yang tepat yang menjalankan daemon sebagai proses anak dan memantaunya dengan mekanisme sistem Unix / Linux yang biasa adalah cara yang lebih baik yang telah lama diterima.
JdeBP