miércoles, 4 de noviembre de 2015

Enviando señales a un proceso con kill

El comando kill se usa para enviar señales a programas. Su sintaxis más común es así:

kill [-signal] PID...

Si no se especifican señales en la línea de comandos, la señal TERM (Terminar) se envía por defecto. El comando kill se usa la mayoría de las veces para enviar las siguientes señales:

Tabla 10-4: Señales comunes
Número Nombre Significado
1 HUP Colgar. Es un vestigio de los buenos y viejos tiempos cuando los terminales estaban conectados a ordenadores remotos mediante líneas telefónicas y modems. La señal se usa para indicar a los programas que el terminal de control ha “colgado”. El efecto de esta señal puede demostrarse cerrando una sesión de terminal. El programa en primer plano, que está corriendo en el terminal, recibirá una señal y terminará.

Esta señal también se usa con muchos programas demonio para provocar una reinicialización. Esto significa que cuando se le envía esta señal a un demonio, se reiniciará y releerá su archivo de configuración. El servidor web Apache es un ejemplo de demonio que usa la señal HUP de esta forma.
2 INT Interrupción. Realiza la misma función que las teclas Ctrl-c enviadas desde el terminal. Normalmente termina un programa.
9 KILL Mata. Esta señal es especial. Mientras que los programas pueden elegir manejar las señales que les son enviadas de diferentes formas, incluso ignorarlas todas, la señal KILL realmente nunca se envía al programa objetivo. En su lugar, el kernel inmediatamente termina el proceso. Cuando un proceso es finalizado de esta forma, no se le da la oportunidad de “limpiar” o guardar su trabajo. Por esta razón, la señal KILL sólo debería ser utilizada como último recurso cuando otras señales de finalización fallan.
15 TERM Terminar. Esta es la señal por defecto enviada por el comando kill. Si un programa aún está lo suficientemente “vivo” como para recibir señales, se terminará.
18 CONT Continuar. Esta restaurará un proceso después de una señal STOP.
19 STOP Parar. Esta señal causa la pausa de un proceso sin terminarlo. Al igual que la señal KILL, no se envía al proceso objetivo, y por lo tanto no puede ser ignorada.

Probemos el comando kill:

[me@linuxbox ~]$ xlogo &
[1] 13546
[me@linuxbox ~]$ kill -1 13546
[1]+  Hangup                  xlogo

En este ejemplo, arrancamos el programa xlogo en segundo plano y luego le enviamos una señal HUP con kill. El programa xlogo termina y el shell indica que el proceso en segundo plano ha recibido una señal de cuelgue. Necesitarás pulsar la tecla intro un par de veces antes de ver el mensaje. Fíjate que las señales pueden ser especificadas con número o con nombre, incluyendo el nombre precedido de las letras “SIG”:

[me@linuxbox ~]$ xlogo &
[1] 13601
[me@linuxbox ~]$ kill -INT 13601
[1]+  Interrupt               xlogo
[me@linuxbox ~]$ xlogo &
[1] 13608
[me@linuxbox ~]$ kill -SIGINT 13608
[1]+  Interrupt               xlogo

Repite el ejemplo anterior y prueba las otras señales. Recuerda, también puedes usar jobspecs en lugar de PIDs.

Los procesos, como los archivos, tienen propietarios, y debes ser el propietario de un proceso (o el superusuario) para enviarle señales con kill.

Además de la lista de señales anterior, usadas generalmente con kill, hay otras señales usadas frecuentemente por el sistema. Aquí tenemos una lista de otras señales comunes:

Tabla 10-5: Otras señales comunes
Número Nombre Significado
3 QUIT Abandonar.
11 SEGV Violación de segmentación (Segmentation Violation). Esta señal se envía si un programa hace un uso ilegal de la memoria, es decir, trata de escribir en un sitio en el que no está autorizado.
20 TSTP Stop de terminal (Terminal Stop). Esta es la señal enviada por el terminal cuando se pulsa Ctrl-z. Al contrario que la señal STOP, el programa recibe la señal TSTP, pero puede optar por ignorarla.
28 WINCH Cambio de ventana (Window Change). Es una señal enviada por el sistema cuando una ventana cambia de tamaño. Algunos programas, como top y less responden a esta señal redibujándose a sí mismos para ajustarse a las nuevas dimensiones de la ventana.

Para los curiosos, se puede ver una lista completa de las señales con el siguiente comando:

[me@linuxbox ~]$ kill -l

No hay comentarios:

Publicar un comentario