kill
En Unix y los sistemas operativos tipo Unix, kill
es un comando utilizado para enviar mensajes sencillos a los procesos ejecutándose en el sistema. Por defecto el mensaje que se envía es la señal de terminación (SIGTERM), que solicita al proceso limpiar su estado y salir.
Pero kill no tiene por qué tener que ver con matar al proceso. El comando kill
es un wrapper alrededor de la llamada al sistema kill()
, que envía señales a procesos o grupos de procesos en el sistema, referenciados por sus IDs de proceso (PIDs) o IDs de grupo de procesos (PGIDs). kill
se ofrece siempre como programa independiente, pero la mayoría de las shells tienen intrínsecamente comandos kill
que pueden diferir levemente de ella.
Pueden enviarse numerosas señales (vea señal (informática) para la lista completa), aunque las señales en las que los usuarios suelen estar más interesados son SIGTERM y SIGKILL. La señal por defecto es SIGTERM. Los programas que cazan esta señal pueden limpiar su estado (como guardar datos de la configuración a un archivo) antes de terminarse. Para los programas que no capturan esta señal, se utiliza una gestión por defecto. En otras ocasiones, un proceso capaz de capturar la señal puede quedar en un estado que le impide manejarla.
Todas las señales excepto SIGKILL y SIGSTOP pueden ser interceptadas por el proceso, esto es, tener una función especial que es llamada cuando el programa recibe tales señales. Sin embargo, SIGKILL y SIGSTOP solo las ve el kernel, lo que provee formas seguras de controlar la ejecución de los procesos. SIGKILL finaliza el proceso, y SIGSTOP lo pone en pausa hasta que se reciba una señal SIGCONT.
Unix cuenta con mecanismos de seguridad para evitar que usuarios no autorizados puedan finalizar otros procesos. Básicamente, para que un proceso pueda enviar una señal a otro, deben tener el mismo propietario, o ser enviada por el superusuario.
Las señales disponibles tienen distintos nombres, asignados a determinados números. El número de las señales puede cambiar entre distintas implementaciones de Unix. SIGKILL suele tener el número 9 y SIGTERM el 15.
Ejemplos
Puede enviarse una señal SIGTERM a un proceso (en este caso con el PID 1234) de tres maneras:
kill 1234
kill -TERM 1234
kill -15 1234
Puede enviarse una señal SIGKILL de dos formas:
kill -KILL 1234
kill -9 1234
Otras señales interesantes son HUP, TRAP, INT y ALRM. Una señal SIGINT puede generarse simplemente presionando CTRL+C en la mayoría de las shells. También es común que CTRL+Z esté mapeada a SIGTSTP y CTRL+\ (backslash) a SIGQUIT, que puede forzar un programa a generar un volcado de memoria.
Programas relacionados
- killall - en algunas variantes de Unix, como Solaris este programa es llamado automáticamente cuando se apaga el sistema. Se comporta de forma parecida al comando kill, pero en lugar de enviar una señal a un proceso, se envía a todos los procesos del sistema. En cambio, en otros como IRIX, Linux y FreeBSD se pasa un argumento con el nombre del proceso o procesos. Así, para eliminar una instancia del reproductor XMMS se ejecutaría
killall xmms
, lo que eliminaría todos los procesos de un ejecutable llamadoxmms
. - pkill - señala procesos por el nombre y otros atributos. Introducido en Solaris 7, ha sido reimplementado para Linux y OpenBSD.
Windows
Microsoft Windows tiene el comando taskkill para finalizar procesos. También se soporta kill
mediante Cygwin o Microsoft Windows Services for UNIX (WSU).