Si eres un usuario nuevo de alguna distribución de Linux seguramente no sepas cómo utilizar uno de los comandos más importantes, que es el que nos sirve para cerrar procesos en ejecución.
Los sistemas operativos basados en Unix incorporan el comando Kill, útil para cerrar aquellos procesos que se han quedado trabados o que no deseamos que se ejecuten más sin tener que reiniciar nuestro ordenador o nuestro servidor.
El comando Kill envía diferentes tipos de señales que permiten cerrar procesos o grupos de procesos. Si no se especifica ningún tipo de señal, se enviará la señal TERM, que es la opción por defecto.
Nota para usuarios de nivel intermedio: El comando puede ser de ámbito externo (localizado en /bin/kill) o interno (shells más recientes) dependiendo del tipo de shell de Linux. En todo caso su uso es muy similar.
Contenidos
Tipos de señal del comando kill
Los diferentes tipos de señal más comunes son las siguientes
- SIGHUP: Se utilizará si la consola no responde o si se ha perdido el control sobre el proceso. Esta señal se utiliza para volver a cargar los archivos de configuración del proceso, así como los posibles archivos de log del mismo.
- SIGKILL: Señal para parar un proceso. Se trata del último recurso para terminar un proceso cuando no responda. No es un modo limpio de cerrar un proceso y es por ésto por lo que no se guardará ningún tipo de dato.
- SIGTERM: Es el modo más rápido de cerrar un proceso. Es la señal por defecto.
Permisos necesarios para cerrar un proceso
Las normas son las siguientes:
- Solamente puedes cerrar tus propios procesos.
- El usuario root podrá cerrar sus procesos, los del sistema y los de cualquier otro usuario.
Sintaxis de uso del comando Kill
La sintaxis es la siguiente:
kill [opciones] [señal] PID
Si eliminamos varios procesos a la vez:
kill [opciones] [señal] PID1, PID2 … PIDn
Como vemos, primero escribimos el nombre del comando, luego las opciones, seguidamente el tipo de señal y por último el PID o los PID de los proceso que queremos eliminar.
Ejemplos del comando Kill
Vamos a ver un ejemplo para matar el proceso httpd de Apache:
Paso #1: Encontrar el PID del proceso.
Lo primero que tenemos que hacer al eliminar cualquier proceso, es encontrar su PID. para ello podemos utilizar los comandos ps o pidof.
[code language=»bash»]
[root@server ~]# pidof httpd
22298
[/code]
Como vemos, el resultado es 22298, que es el identificador del proceso, aunque también podríamos tener como resultado una lista de identificadores, ya que el proceso podría tener varias instancias.
También podemos ejecutar lo siguiente:
[code language=»bash»]
[root@server ~]# ps aux | grep httpd
httpd 22298 0.0 0.1 4248 1432 ? S Jul31 0:00 /usr/sbin/httpd -f /etc/httpd/httpd.conf
httpd 22304 0.0 0.5 13752 3936 ? Ss Jul31 0:00 /usr/bin/php5-cg
[/code]
Paso #2: Matar el proceso usando su PID.
El PID 22298 es el que está asignado al proceso httpd. Para terminar el proceso y cerrar el servidor Apache, necesitamos pasar su PID:
[code language=»bash»]
[root@server ~]# kill 22298
22298
[/code]
Ésto terminará el proceso con el PID 22298, algo que podemos comprobar si utilizamos de nuevo el comando pidof o el comando ps:
[code language=»bash»]
[root@server ~]# pidof httpd
22298
[/code]
Si no especificamos ninguna señal. Se utilizará por defecto la señal SIGTERM (-15), por lo que los siguientes comandos son equivalentes:
# kill -15 22298 # kill -SIGTERM 22298
Si la señal SIGTERM (-15) no es suficiente, como por ejemplo cuando los sockets de Apache están abiertos, podemos utilizar la señal SIGKILL (-9):
# kill -9 22298 # kill -SIGKILL 22298
Esta señal garantiza que el proceso finalizará sí o sí, interrumpiendo cualquier tarea en ejecución. Si Apache tiene varios procesos en ejecución podemos eliminarlos todos a la vez:
# kill -9 22298 222300 222302 # kill -15 22298 222300 222302
El comando killalll
En Linux también tenemos el comando killall para cerrar procesos por su nombre, aunque este comando Unix tiene otra función. Por ejemplo:
# killall -15 httpd
Ésto cerrará todas las instancias del proceso httpd de Apache en Linux. Sin embargo, en Unix, este comando cerrará todos los procesos, por lo que será mejor no confundirnos a la hora de utilizarlo.