Linux: Menulis pengawas untuk memantau banyak proses

14

Beberapa tahun yang lalu, seorang rekan kerja datang dengan solusi yang elegan untuk program pengawas. Program ini berjalan pada Windows dan menggunakan objek Windows Event untuk memantau proses handle (PID) dari beberapa aplikasi. Jika salah satu proses dihentikan secara tak terduga, pegangan prosesnya tidak lagi ada dan pengawasnya akan segera diberi sinyal. Watchdog kemudian akan mengambil tindakan yang tepat untuk "menyembuhkan" sistem.

Pertanyaan saya adalah, bagaimana Anda mengimplementasikan anjing penjaga seperti itu di Linux? Apakah ada cara untuk satu program untuk memantau PID banyak orang lain?

Justin Ethier
sumber
Lihat juga Memastikan proses selalu berjalan untuk daftar program pemantauan / pengawasan.
Gilles 'SO- berhenti bersikap jahat'
Lihat juga stackoverflow: stackoverflow.com/questions/9400724/…
Mike Pennington

Jawaban:

17

Cara tradisional, portabel, dan umum digunakan adalah proses induk mengawasi anak-anaknya.

Primitif dasar adalah panggilan sistem waitdanwaitpid . Ketika proses anak meninggal, proses induk menerima SIGCHLDsinyal, mengatakan itu harus memanggil waituntuk mengetahui anak yang mati dan status keluarnya. Sebaliknya proses induk dapat memilih untuk mengabaikan SIGCHLDdan memanggil waitpid(-1, &status, WNOHANG)dengan nyaman.

Untuk memantau banyak proses, Anda akan memunculkan semuanya dari induk yang sama, atau memohon semuanya melalui proses pemantauan sederhana yang hanya memanggil program yang diinginkan, menunggu untuk mengakhiri dan melaporkan penghentian (dalam sintaksis shell:) myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe. Jika Anda berasal dari dunia Windows, perhatikan bahwa memiliki program kecil yang melakukan satu tugas khusus adalah desain umum di dunia Unix, OS dirancang untuk membuat proses menjadi murah.

Ada banyak program pemantauan proses (juga disebut pengawas) yang dapat melaporkan ketika suatu proses mati dan secara opsional memulai kembali dan lebih jauh lagi selain itu: Monit , Mengawasi , Pemula , ...

Gilles 'SANGAT berhenti menjadi jahat'
sumber
+1, persis apa yang saya cari - terima kasih atas jawaban yang mendetail.
Justin Ethier
0

Pendekatan saya untuk masalah ini adalah menggunakan init dan perintah respawn bawaan untuk memulai / memulai ulang apa pun yang Anda perlu jalankan. Inilah maksud dan tujuan awalnya. Dalam beberapa kasus, Anda perlu menjalankan skrip untuk dibersihkan setelah proses mati, atau untuk mempersiapkan proses untuk memulai (sebagian besar waktu pekerjaannya sama). Dalam kebanyakan kasus, skrip bash yang berakhir dengan exec berfungsi baik untuk ini.


sumber