Linux: Birden çok işlemi izlemek için bir bekçi köpeği yazma


14

Birkaç yıl önce, bir iş arkadaşı bir bekçi köpeği programı için zarif bir çözüm buldu. Program Windows üzerinde çalıştı ve çeşitli uygulamaların işlem tutamaçlarını (PID'ler) izlemek için Windows Olay nesnelerini kullandı . İşlemlerden herhangi biri beklenmedik bir şekilde sona ererse, işlem tutamağı artık mevcut olmayacak ve bekçisi derhal sinyal verilecektir. Gözcü daha sonra sistemi “iyileştirmek” için uygun bir eylemde bulunacaktır.

Sorum şu: Linux'ta böyle bir bekçi köpeğini nasıl uygularsınız? Tek bir programın diğerlerinin PID'lerini izlemesinin bir yolu var mı?


Ayrıca , izleme / denetleme programlarının listesi için bir işlemin her zaman çalıştığından emin olun .
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


17

Geleneksel, taşınabilir, yaygın olarak kullanılan yöntem, ebeveyn sürecinin çocuklarını izlemesidir.

Temel ilkeler waitvewaitpid sistem çağrılarıdır. Bir alt süreç öldüğünde, ana süreç bir SIGCHLDsinyal alır waitve hangi çocuğun öldüğünü ve çıkış durumunu öğrenmesi gerektiğini söyler . Üst süreç bunun yerine yok saymayı SIGCHLDve waitpid(-1, &status, WNOHANG)uygun şekilde çağırmayı seçebilir .

Birçok işlemi izlemek için, hepsini aynı ana öğeden çıkarırsınız veya yalnızca istenen programı çağıran, sonlandırılmasını bekler ve sonlandırmayı rapor eder (kabuk sözdiziminde myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe). Windows dünyasından geliyorsanız, küçük bir programın özel bir görev gerçekleştirmesinin Unix dünyasında ortak bir tasarım olduğunu unutmayın, işletim sistemi işlemleri ucuz hale getirmek için tasarlanmıştır.

Bir işlem öldüğünde ve isteğe bağlı olarak yeniden başlattığında rapor verebilen çok sayıda süreç izleme (süpervizör olarak da bilinir) programı vardır: Monit , Supervise , Upstart ,…


+1, tam olarak aradığım şey - böyle ayrıntılı bir cevap için teşekkür ederim.
Justin Ethier

0

Bu konudaki yaklaşımım, çalıştırmanız gereken her şeyi başlatmak / yeniden başlatmak için init ve yerleşik yeniden doğma yönergesini kullanmaktır. Bu onun orijinal amacı ve ana amacıydı. Bazı durumlarda, bir işlem öldükten sonra temizlemek için bir komut dosyası çalıştırmanız veya sürecin başlaması için hazırlanmanız gerekir (çoğu zaman iş aynıdır). Çoğu durumda exec ile biten bir bash betiği bunun için harika çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.