Linux: napisanie watchdoga do monitorowania wielu procesów


14

Kilka lat temu pewien współpracownik wymyślił eleganckie rozwiązanie dla programu nadzoru. Program działał w systemie Windows i wykorzystywał obiekty zdarzeń Windows do monitorowania uchwytów procesów (PID) kilku aplikacji. Jeśli którykolwiek z procesów zostanie nieoczekiwanie zakończony, jego uchwyt procesu nie będzie już istniał, a jego watchdog zostanie natychmiast zasygnalizowany. Organ nadzorujący podjąłby wówczas odpowiednie działanie, aby „wyleczyć” system.

Moje pytanie brzmi: jak zaimplementowałbyś takiego strażnika w systemie Linux? Czy istnieje sposób, aby jeden program monitorował PID wielu innych?


Zobacz także Upewnij się, że proces jest zawsze uruchomiony dla listy programów monitorujących / nadzorujących.
Gilles 'SO - przestań być zły'

Odpowiedzi:


17

Tradycyjny, przenośny, powszechnie używany sposób polega na tym, że proces nadrzędny czuwa nad swoimi dziećmi.

Podstawowymi operacjami podstawowymi są wywołania systemowe waitiwaitpid . Kiedy proces potomny umiera, proces macierzysty otrzymuje SIGCHLDsygnał informujący, że powinien zadzwonić, waitaby dowiedzieć się, które dziecko zmarło i status wyjścia. Proces nadrzędny może zamiast tego wybrać ignorowanie SIGCHLDi wywoływanie waitpid(-1, &status, WNOHANG)według własnego uznania.

Aby monitorować wiele procesów, albo odradzasz je wszystkie od tego samego rodzica, albo wywołujesz je wszystkie poprzez prosty proces monitorowania, który po prostu wywołuje pożądany program, czeka na jego zakończenie i informuje o zakończeniu (w składni powłoki:) myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe. Jeśli pochodzisz ze świata Windows, zauważ, że posiadanie małych programów wykonujących jedno wyspecjalizowane zadanie jest powszechnym projektem w świecie Unix, system operacyjny jest zaprojektowany tak, aby procesy były tanie.

Istnieje wiele programów do monitorowania procesów (zwanych również nadzorcami), które mogą raportować, kiedy proces umiera i opcjonalnie go restartować, a także wiele więcej: Monitorowanie , Nadzór , Upstart ,…


+1, dokładnie to, czego szukałem - dziękuję za tak szczegółową odpowiedź.
Justin Ethier

0

Moje podejście do tego problemu polega na użyciu init i jego wbudowanej dyrektywy respawn, aby uruchomić / zrestartować cokolwiek potrzebujesz. To była jego pierwotna intencja i główny cel. W niektórych przypadkach konieczne będzie uruchomienie skryptu w celu wyczyszczenia po zakończeniu procesu lub przygotowanie się do rozpoczęcia procesu (przez większość czasu praca jest taka sama). W większości przypadków skrypt bash kończący się na exec działa do tego doskonale.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.