systemadmin.es > Utilidades > Mandar señales a procesos

Mandar señales a procesos

El comando kill se usa generalmente para matar procesos mediante un SIGTERM o un SIGKILL, pero podemos mandar otras señales a los procesos.

Mediante kill -l podemos listar todas las señales que podemos mandar a un proceso:

# 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	

Si no indicamos ninguna se manda la señal SIGTERM. Dicha seña puede ser capturada por el proceso para finalizar correctamente su ejecución o incluso simplemente ignorada. Por el contrario, mediante un SIGKILL (kill -9) que el proceso termina inmediatamente.

Pero también podemos mandar otras señales a los procesos, por ejemplo un segmentation fault con SIGSEGV:

[root@qapla ~]# sleep 100 &
[1] 9339
[root@qapla ~]# kill -SIGSEGV 9339
[root@qapla ~]# 
[1]+  Segmentation fault      sleep 100

Quizás no tiene utilidad práctica pero puede resultar útil para gastar bromas.

También existen las señales USR (SIGUSR1 y SIGUSR2) para que el proceso las capture y según su criterio ejecute alguna acción. Por ejemplo, el dd al recibir un SIGUSR1 muestra estadísticas de progreso.

Por otro lado también tenemos las señales SIGSTOP y SIGCONT que permiten parar y continuar la ejecución de un proceso. Por ejemplo si ejecutamos este script:

#!/bin/bash
while true;
do
  echo 1
  sleep 1
  echo 2
  sleep 1
done

En el caso que le mandemos un SIGSTOP veremos como para su ejecución:

1
2
1
2

[1]+  Stopped                 bash caca.sh

Y con el kill -SIGCONT continuará:

2
1
2
(...)

En el caso de SIGSTOP el proceso puede capturar la seña y ignorarla, pero si se usa SIGSTP (equivale a Control-Z) no puede capturar dicha señal y el proceso para su ejecución.

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>