Respuesta corta : Enviar SIGTERM
, 30 segundos más tarde, SIGKILL
. Es decir, envíe SIGTERM
, espere un poco (puede variar de un programa a otro, es posible que conozca mejor su sistema, pero de 5 a 30 segundos es suficiente. Al apagar una máquina, es posible que la vea automáticamente esperando hasta 1'30 s). ¿Por qué la prisa, después de todo?), Luego envía SIGKILL
.
Respuesta razonable : SIGTERM
, SIGINT
, SIGKILL
Esto es más que suficiente. Es muy probable que el proceso termine antes SIGKILL
.
Respuesta larga : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
,SIGKILL
Esto es innecesario, pero al menos no está engañando el proceso con respecto a su mensaje. Todas estas señales no significan desea que el proceso para detener lo que está haciendo y salir.
No importa qué respuesta elija de esta explicación, ¡téngalo en cuenta!
Si envía una señal que significa otra cosa, el proceso puede manejarla de formas muy diferentes (por un lado). Por otro lado, si el proceso no maneja la señal, no importa lo que envíe después de todo, el proceso se cerrará de todos modos (cuando la acción predeterminada es terminar, por supuesto).
Por lo tanto, debe pensar como programador. ¿Codificaría un controlador de funciones para, digamos, SIGHUP
salir de un programa que se conecta con algo, o lo haría un bucle para intentar conectarse de nuevo? ¡Esa es la pregunta principal aquí! Por eso es importante enviar señales que signifiquen lo que pretendes.
Respuesta larga casi estúpida :
La siguiente tabla contiene las señales relevantes y las acciones predeterminadas en caso de que el programa no las maneje.
Los ordené en el orden que sugiero usar (por cierto, le sugiero que use la respuesta razonable , no esta aquí), si realmente necesita probarlos todos (sería divertido decir que la tabla está ordenada en términos de la destrucción que pueden causar, pero eso no es del todo cierto).
NO se recomiendan las señales con un asterisco (*) . Lo importante de estos es que es posible que nunca sepa para qué está programado. SIGUSR
¡ Especialmente ! Puede iniciar el apocalipsis (¡es una señal gratuita para que un programador haga lo que quiera!). Pero, si no se maneja O, en el caso poco probable, se maneja para terminar, el programa terminará.
En la tabla, las señales con opciones predeterminadas para terminar y generar un volcado de memoria se dejan al final, justo antes SIGKILL
.
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
Entonces sugeriría para esta larga respuesta casi estúpida :
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGQUIT
, SIGABRT
,SIGKILL
Y finalmente, el
Definitivamente estúpida respuesta larga y larga :
No intentes esto en casa.
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, SIGQUIT
, SIGABRT
, SIGSEGV
, SIGILL
, SIGFPE
Y si nada funcionó, SIGKILL
.
SIGUSR2
debe probarse antes SIGUSR1
porque estamos mejor si el programa no maneja la señal. Y es mucho más probable que maneje SIGUSR1
si solo maneja uno de ellos.
Por cierto, el KILL : no está mal enviar SIGKILL
a un proceso, como se indicó en otra respuesta. Bueno, piensa en lo que pasa cuando envías un shutdown
comando. Lo intentará SIGTERM
y SIGKILL
solo. ¿Por qué cree que es así? ¿Y por qué necesita otras señales, si el mismo shutdown
comando usa solo estas dos?
Ahora, volviendo a la respuesta larga , este es un buen delineador:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
Duerme 30 segundos entre señales. ¿Por qué más necesitarías un delineador ? ;)
Además, se recomienda: inténtelo solo con señales 15 2 9
de la respuesta razonable .
seguridad : retire el segundo echo
cuando esté listo para comenzar. Yo lo llamo mi dry-run
para los online . Úselo siempre para probar.
Guión killgracefully
En realidad, estaba tan intrigado por esta pregunta que decidí crear un pequeño guión para hacer precisamente eso. Por favor, siéntase libre de descargarlo (clonarlo) aquí:
Enlace de GitHub al repositorio de Killgracefully