La respuesta de @hvd es básicamente correcta. Para respaldar eso aún más, el initproceso primero se enviará SIGTERMa los procesos cuando esté apagando su computadora, luego, después de un retraso, se enviará SIGKILLsi aún no han salido. Los procesos no pueden manejar / ignorar SIGKILL.
Sin embargo, para dar un poco más de detalle, la respuesta real es que no tiene forma de saber con certeza si el programa lo maneja. SIGTERMes la señal más habitual para pedir cortésmente que un programa se cierre, pero todo el manejo de la señal depende de que el programa haga algo con la señal.
Para decirlo de otra manera, según las otras respuestas, si tuviera un programa escrito por @Jos o por @AlexGreg, presumiblemente estarían manejando SIGQUITpero posiblemente no SIGTERM, y por SIGTERMlo tanto el envío sería menos "suave" que SIGQUIT.
He escrito un código para que puedas jugarlo tú mismo. Guarde lo siguiente como signal-test.c, luego compile con
gcc -o signal-test signal-test.c
Luego puede ejecutarlo ./signal-testy ver qué sucede cuando envía diferentes señales con killall -s <signal>.
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int flag = 0;
void handle_signal(int s)
{
flag = s;
}
int main(int argc, char *argv[])
{
signal(SIGTERM, handle_signal);
signal(SIGQUIT, handle_signal);
while(flag == 0){
sleep(1);
}
printf("flag is %d\n", flag);
return flag;
}
Tal como está, el código maneja tanto SIGTERM como SIGQUIT con gracia. Puede intentar comentar las líneas signal(SIG...(utilizando un //al comienzo de la línea) para eliminar el controlador de señal, luego ejecutar y enviar las señales nuevamente. Debería poder ver estas diferentes salidas:
$ ./signal-test
Terminated
$ ./signal-test
Quit (core dumped)
$ ./signal-test
flag is 15
$ ./signal-test
flag is 3
dependiendo de si manejas las señales o no.
También podría intentar ignorar las señales:
signal(SIGTERM, SIG_IGN);
Si haces eso, el envío SIGTERMno hará nada, tendrás que usarlo SIGKILLpara finalizar el proceso.
Más detalles en man 7 signal. Tenga signal()en cuenta que el uso de esta manera se considera no portátil, ¡aunque es mucho más fácil que la alternativa!
Otra nota al pie de página menor: sobre los killallintentos de Solaris de matar todos los procesos. Todos ellos. Si lo ejecutas como root, te sorprenderás :)