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?
linux
process
monitoring
Justin Ethier
źródło
źródło
Odpowiedzi:
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
wait
iwaitpid
. Kiedy proces potomny umiera, proces macierzysty otrzymujeSIGCHLD
sygnał informujący, że powinien zadzwonić,wait
aby dowiedzieć się, które dziecko zmarło i status wyjścia. Proces nadrzędny może zamiast tego wybrać ignorowanieSIGCHLD
i wywoływaniewaitpid(-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 ,…
źródło
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.
źródło