Pytanie w sprawie signals, linux – Jak sygnalizować aplikację bez zabijania jej w systemie Linux?

30

Mam aplikację watchdog. Ogląda moją główną aplikację, która może ulec awarii z tego lub innego powodu (wiem, że jest źle, ale nie o to chodzi).

Zaprogramowałem ten watchdog, aby akceptował sygnały SIGUSR1, aby zatrzymać monitorowanie obecności mojej aplikacji. Sygnalizuję to

kill -SIGUSR1 `pidof myapp`

To działa bardzo dobrze. Mój problem pojawia się, gdy próbuję zasygnalizować starszą wersję watchdoga, która nie ma wbudowanej funkcjonalności. W tym przypadku sygnał zabicia zabija watchdoga (kończy proces), co prowadzi do dalszych komplikacji (ponowne uruchomienie urządzenia) .

Czy istnieje sposób, aby zasygnalizować mojemu watchdogowi SIGUSR1, aby nie zakończył się, jeśli ten konkretny sygnał jest nieobsługiwany?

„... wiem, że jest źle, ale to nie o to chodzi” - wkładasz mleko do nosa :) +1 za to. jww

Twoja odpowiedź

2   odpowiedź
30

Dokumenty GNU o obsłudze sygnału:

Sygnały SIGUSR1 i SIGUSR2 są odłożone na bok, abyś mógł ich używać w dowolny sposób. Są one przydatne do prostej komunikacji międzyprocesowej, jeśli zapisujesz dla nich program obsługi sygnału w programie odbierającym sygnał. Istnieje przykład pokazujący użycie SIGUSR1 i SIGUSR2 w sekcji Signaling Another Process.Domyślną akcją jest zakończenie procesu.

Domyślną akcją dla SIGINFO jest nie robienie niczego, więc może być bardziej odpowiednie:

SIGINFO: Żądanie informacji. W 4.4 BSD i systemie GNU sygnał ten jest wysyłany do wszystkich procesów w grupie procesów pierwszego planu terminalu sterującego, gdy użytkownik wpisze znak STATUS w trybie kanonicznym; patrz sekcja Znaki powodujące sygnały. Jeśli proces jest liderem grupy procesów, domyślną czynnością jest wydrukowanie niektórych informacji o stanie systemu i tego, co robi ten proces.W przeciwnym razie domyślnie nic nie robi.

SIGHUP jest emitowany, gdy terminal sterujący jest zamknięty, ale ponieważ większość demonów nie jest podłączona do terminala, nie jest niczym niezwykłym używanie go jako „przeładowanie”:

Programy Daemon czasami używają SIGHUP jako sygnału do zrestartowania się. Najczęstszym powodem tego jest ponowne odczytanie pliku konfiguracyjnego, który został zmieniony.

BTW, twój watchdog może od czasu do czasu odczytać plik konfiguracyjny, aby wiedzieć, czy powinien ponownie uruchomić proces.

Moim osobistym faworytem dla strażnika jestkierownik.

$ supervisorctl start someapp
someapp: started

$ supervisorctl status someapp
someapp                RUNNING    pid 16583, uptime 19:16:26

$ supervisorctl stop someapp
someapp: stopped

Sprawdź, czykill -l zwraca listę sygnałów na platformie i wypróbuj niektóre z nich, ale SIGUSR1 wydaje się złym wyborem.

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

[AKTUALIZACJA]

Carpetsmoker komentuje różnice w zachowaniu między systemami Linux i BSD:

SIGINFO wydaje się działać inaczej w GNU libc i BSD; w BSD działa tak, jak opisujesz, ale w Linuksie albo nie istnieje, albo jest taki sam jak SIGPWR ... Podręcznik GNU libc wydaje się pod tym względem niepoprawny (twoje wyjście kill -l nie pokazuje również SIGINFO ) ... Nie wiem, dlaczego GNU go nie obsługuje, ponieważ uważam to za bardzo przydatne ... - Carpetsmoker

SIGINFO wydaje się działać inaczej w GNU libc i BSD; na BSD działa tak, jak opisujesz, ale na Linuksie albo nie istnieje, albo jest taki sam jakSIGPWR... Podręcznik GNU libc wydaje się pod tym względem niepoprawny (twójkill -l wyjście również nie jest wyświetlaneSIGINFO) ... Nie wiem, dlaczego GNU go nie obsługuje, ponieważ uważam, że tak jestbardzo przydatny... Martin Tournoij
3

jeśli obsługa nie jest obecna. Oznacza to, że nie możesz już robić tego, co chcesz.

Poza aktualizacją watchdoga, nic nie możesz zrobić (i zakładam, że nie jesteś w stanie odróżnić wersji watchdog od wewnątrz programu przed wysłaniem sygnału).

Powiązane pytania