tag picard musicbrainz mac kid3 español editar easytag linux signals

linux - mac - musicbrainz picard español



¿Cómo señalizar una aplicación sin matarla en Linux? (2)

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?


De los documentos de GNU sobre el manejo de señales:

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, el valor predeterminado es no hacer nada .

SIGHUP se emite cuando el terminal de control está cerrado, pero como la mayoría de los demonios 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 es el supervisor .

$ supervisorctl start someapp someapp: started $ supervisorctl status someapp someapp RUNNING pid 16583, uptime 19:16:26 $ supervisorctl stop someapp someapp: stopped

Comprueba si kill -l devuelve la lista de señales en tu plataforma y prueba algunas de ellas, pero SIGUSR1 parece 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 libc de GNU parece incorrecto a este respecto (su salida kill -l tampoco muestra SIGINFO ) ... no sé por qué GNU no lo admite, porque me parece muy útil ... - Carpetsmoker


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).