Linux: enviar señales a un proceso con el comando kill

Kill es un comando unix/linux que permite enviar señales a uno o varios procesos del sistema a través de la shell (bash, ksh, etc). Las señales más utilizadas suele ser la de matar un proceso (9 ó SIGKILL), pararlo (TERM) o reiniciarlo (1 ó HUP) pero hay muchas más que pueden ser útiles en ocasiones. El listado completo de señales disponibles puede visualizarse ejecutando kill -l:

$ 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

Para solicitar la finalización de un proceso, se utiliza la señal TERM, que es la señal por defecto si no se especifica otra. así que para solicitar el fin de ejecución de uno o varios procesos únicamente tenemos que ejecutar kill seguido de los PID correspondientes:

# kill 3454 3459 3750

Para forzar que uno o varios procesos terminen de forma inmediata (sin solicitar ni preguntar…) usamos la señal SIGKILL (9). Hay que ser cautos al usar esta señal porque fuerza a los procesos a terminar inmediatamente sin permitirles terminar de forma limpia, es decir, puede que no borre los PID, que no deje terminar las peticiones pendientes, etc:

# kill -9 6574

Si quisieramos forzar que todos los procesos con un determinado nombre finalicen inmediatamente usaríamos killall en lugar de kill:

# killall -9 httpd

Otro ejemplo sería el de suspender un proceso, para ello le enviamos la señal de STOP (19) seguida del proceso. Si no conocemos el ID de la señal podemos hacerlo también a través del nombre. En esta señal el proceso quedaría suspendido, por lo que todavía figuraría en la lista de procesos y podríamos reanudarlo posteriormente (próximo ejemplo):

# kill -19 5227

ó

# kill -STOP  5227

Ahora que sabemos suspender procesos, es interesante conocer como reactivarlos, para ello usamos la señal CONT (18). En este ejemplo vamos a «revivir» el proceso anterior:

# kill -18 5227

ó

# kill -CONT  5227

Una de las señales más importantes es HUP (1). Esta señal para y reinicia el proceso indicado, también se puede aplicar con el nombre del proceso además del ID.

# kill -HUP 9873

ó

# kill -HUP script.sh

En caso de querer utilizarlo para por ejemplo, reiniciar todos los procesos httpd usaríamos killall en lugar de kill:

# killall -HUP httpd

Estos son algunos ejemplos de utilización de señales sobre procesos, como siempre os digo, podéis revisar las páginas man para profundizar sobre todas las señales disponibles.