Подтвердить что ты не робот

Как сигнализировать приложение, не убивая его в Linux?

У меня есть приложение сторожевого таймера. Он наблюдает за моим основным приложением, которое может сбой по той или иной причине (я знаю, что это плохо, но это не главное).

Я запрограммировал этот сторожевой таймер принять сигналы SIGUSR1, чтобы остановить мониторинг присутствия моего приложения. Я сигнализирую об этом с помощью

kill -SIGUSR1 `pidof myapp`

Это работает очень хорошо. Моя проблема возникает, когда я пытаюсь сигнализировать более старую версию сторожевого таймера, которая не имеет встроенных функций. В этом случае сигнал kill убивает сторожевого таймера (завершает процесс), что приводит к дальнейшим осложнениям (перезагрузка устройства).

Есть ли способ сигнализировать мой сторожевой таймер с помощью SIGUSR1, чтобы он не прерывался, если этот конкретный сигнал был необработанным?

4b9b3361

Ответ 1

Из GNU docs об обработке сигналов:

Сигналы SIGUSR1 и SIGUSR2 зарезервированы для использования любым способом. Они полезны для простой межпроцессной коммуникации, если вы пишете обработчик сигналов для них в программе, которая получает сигнал. Ниже приведен пример использования SIGUSR1 и SIGUSR2 в разделе "Сигнализация другого процесса". Действие по умолчанию - это завершение процесса.

Действие по умолчанию для SIGINFO - ничего не делать, поэтому оно может быть более подходящим:

SIGINFO: запрос информации. В 4.4 BSD и системе GNU этот сигнал отправляется всем процессам в группе процесса переднего плана управляющего терминала, когда пользователь вводит символ STATUS в каноническом режиме; см. раздел Символы, вызывающие сигналы. Если процесс является лидером группы процессов, действие по умолчанию заключается в том, чтобы печатать некоторую информацию о состоянии системы и о том, что делает этот процесс. В противном случае по умолчанию ничего не делать.

SIGHUP испускается, когда управляющий терминал закрыт, но поскольку большинство демонов не подключены к терминалу, это не редкость использовать это как "перезагрузка":

Программы Daemon иногда используют SIGHUP в качестве сигнала для перезагрузки, наиболее распространенной причиной этого является перепросмотр измененного файла конфигурации.

Кстати, ваш сторожевой таймер время от времени может читать конфигурационный файл, чтобы узнать, должен ли он возобновить процесс.

Мой личный фаворит для сторожевого пса supervisor.

$ supervisorctl start someapp
someapp: started

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

$ supervisorctl stop someapp
someapp: stopped

Посмотрите, возвращает ли kill -l список сигналов на вашей платформе и попробуйте некоторые из них, но SIGUSR1 кажется плохим выбором.

$ 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

[ОБНОВЛЕНИЕ]

Комментарии Carpetsmoker о различиях в поведении Linux и BSD:

SIGINFO, похоже, работает по-разному в GNU libc и BSD; на BSD, он работает так, как вы описываете, но в Linux он либо не существует, либо такой же, как SIGPWR... Руководство GNU libc кажется неправильным в этом отношении (ваш вывод kill -l также не отображает SIGINFO)... Я не знаю, почему GNU не поддерживает его, потому что я считаю его очень полезным... - Carpetsmoker

Ответ 2

Действие по умолчанию при получении SIGUSR1 прекращается, если обработчик отсутствует. Это означает, что вы больше не можете делать то, что хотите, с этим сигналом.

За исключением обновления сторожевого таймера, вы ничего не можете сделать (и я предполагаю, что вы не можете отличить версии сторожевого таймера от программы до отправки сигнала).