Pregunta sobre signals, linux – ¿Cómo señalizar una aplicación sin matarla en Linux?

30

Tengo una aplicación de vigilancia. Observa mi aplicación principal que podría fallar por una razón u otra (sé que es mala, pero no es el punto).

Programé este watchdog para aceptar señales SIGUSR1 para dejar de monitorear la presencia de mi aplicación. Lo señalo con

kill -SIGUSR1 `pidof myapp`

Esto funciona muy bien. Mi problema surge cuando intento señalar una versión anterior del watchdog que no tiene esta funcionalidad incorporada. En este caso, la señal de kill mata al watchdog (finaliza el proceso), lo que conlleva más complicaciones (reinicio del dispositivo) .

¿Hay alguna forma de indicar a mi perro guardián con SIGUSR1 para que no termine si esta señal en particular no se maneja?

"... Sé que es malo, pero este no es el punto". Me pusiste leche en la nariz :) +1 por eso. jww

Tu respuesta

2   la respuesta
30

Desde elDocumentos de GNU sobre el manejo de la señal:

Las señales SIGUSR1 y SIGUSR2 se reservan para que las utilice de la forma que desee. Son útiles para la comunicación entre procesos simple, si escribe un controlador de señales para ellos en el programa que recibe la señal. Hay un ejemplo que muestra el uso de SIGUSR1 y SIGUSR2 en la sección Señalización de otro proceso.La acción por defecto es terminar el proceso..

La acción predeterminada para SIGINFO es no hacer nada, por lo que puede ser más adecuado:

SIGINFO: Solicitud de información. En 4.4 BSD y el sistema GNU, esta señal se envía a todos los procesos en el grupo de proceso de primer plano del terminal de control cuando el usuario escribe el carácter ESTADO en modo canónico; Consulte la sección Caracteres que causan señales. Si el proceso es el líder del grupo de procesos, la acción predeterminada es imprimir cierta información de estado sobre el sistema y lo que está haciendo el proceso.De lo contrario lo predeterminado es no hacer nada..

SIGHUP se emite cuando el terminal de control está cerrado, pero como la mayoría de los daemons no están conectados a un terminal, no es raro usarlo como "recargar":

Los programas de Daemon a veces usan SIGHUP como una señal para reiniciarse, la razón más común para esto es volver a leer un archivo de configuración que ha sido cambiado.

Por cierto, su perro guardián podría leer un archivo de configuración de vez en cuando para saber si debería reiniciar el proceso.

Mi favorito personal para un perro guardián essupervisor.

$ supervisorctl start someapp
someapp: started

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

$ supervisorctl stop someapp
someapp: stopped

Ve sikill -l devuelve la lista de señales en su plataforma y pruebe algunas de ellas, pero SIGUSR1 parece ser una mala elección.

$ 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

[ACTUALIZAR]

Carpetsmoker comenta sobre las diferencias de comportamiento entre Linux y BSD:

SIGINFO parece funcionar diferente en GNU libc & BSD; en BSD, funciona como lo describe, pero en Linux, o bien no existe, o es el mismo que SIGPWR ... El manual de libc de GNU parece incorrecto a este respecto (su salida kill -l tampoco muestra SIGINFO ) ... no sé por qué GNU no lo admite, porque lo encuentro muy útil ... - Carpetsmoker

SIGINFO parece funcionar diferente en GNU libc & BSD; en BSD, funciona como usted describe, pero en Linux, o bien no existe, o es lo mismo queSIGPWR... El manual libc de GNU parece incorrecto a este respecto (sukill -l la salida tampoco se muestraSIGINFO) ... No sé por qué GNU no lo admite, porque me parece que esmuy útil... Martin Tournoij
3

La acción predeterminada al recibir un SIGUSR1 es terminar si el manejador no está presente. Lo que significa que ya no puedes hacer lo que quieres con esa señal.

Aparte de actualizar el watchdog, no hay nada que pueda hacer (y asumo que no puede diferenciar las versiones de watchdog dentro del programa antes de enviar la señal).

Preguntas relacionadas