Ya hablé de como se pueden matar procesos de forma gráfica en la entrada anterior, sin embargo esto no es posible si el entorno gráfico se vuelve inestable o no responde. Antes de cerrar la sesión con Ctrl + Alt + Retroceso podemos acceder a una de las tty con Ctrl + Alt + F2 (o cualquier tecla de función desde F1 hasta F6) e intentar matar el proceso que nos esta dando problemas. A continuación explico unos comandos que nos ayudarán en esa tarea.

Comandos ps y pgrep

Antes de poder matar un proceso tenemos que averiguar su PID. Podemos mirarlo con los comandos ps y pgrep.

[root@host ~]# ps -A

El comando anterior mostrará todos los procesos en ejecución, para poder verlos con calma podemos usar una tubería y pasar la salida a los comandos less o more.

[root@host ~]# ps -A |less

También podemos pasar el comando grep para filtrar los procesos.

[root@host ~]# ps -A |grep cr
32 ? 00:00:00 crypto
861 ? 00:00:01 crond
2704 ? 00:00:40 xscreensaver

Si lo que queremos es buscar procesos filtrando los resultados es mejor usar pgrep, con este comando podemos buscar cadenas no solo en el nombre del proceso, sino también en la cadena de ejecución.

[root@host ~]# pgrep -l cr
32 crypto
861 crond
2704 xscreensaver
[root@host ~]# pgrep -lf cr
32 crypto
861 /usr/sbin/crond -n
2704 xscreensaver -nosplash
2816 /usr/bin/gnome-keyring-daemon --start --foreground --components=secrets
4329 /bin/bash /scripts/cambiawall -d /home/Gabri/Imágenes/wallscript

Con pgrep se pueden usar los caracteres comodines como '* ? ^'.

Comandos kill y killall

Una vez que ya sabemos el PID del proceso que queremos matar usamos el comando kill seguido del PID para terminar con el proceso. En este ejemplo voy a finalizar el proceso 4329 que corresponde a un script que escribí que me cambia automáticamente el fondo de pantalla.

[root@host ~]# kill 4329

Si no funciona podemos probar enviando la señal "kill".

[root@host ~]# kill -KILL 4329

Esto esta muy bien pero ¿realmente necesito saber el PID para matar un proceso? la respuesta es no, no necesitamos necesariamente saber cual es el PID del proceso. Si sabemos el nombre podemos matarlo con el comando killall.

[root@host ~]# killall nautilus

Al igual que kill podemos mandar la señal "kill" si el proceso no terminara con la instrucción anterior.

[root@host ~]# killall -KILL nautilus

Existe también el comando pkill que sería el equivalente al comando 'kill `pgrep nautilus`' pero no recomiendo usarlo porque si nos confundimos escribiendo la cadena que queremos filtrar estaríamos matando todos los procesos que coincidieran con nuestra cadena.

El comando top

Ya sabemos que antes de poder matar un proceso debemos saber cual es su PID o su nombre. Ahora bien, en caso de no saber el PID ni el nombre del proceso ¿que hacemos?. Si sabemos que hay un proceso que nos esta dando problemas pero no sabemos cuál es podemos usar el comando top y ver si el sistema se ha vuelto lento porque el proceso consume demasiada CPU o porque ocupa demasiada memoria.

Este comando nos muestra una lista de los procesos que se están ejecutando junto con el PID, el consumo de CPU del proceso, la memoria que ocupa y otra información interesante.

Podemos interactuar con top mediante el teclado. Pulsando la tecla h veremos una lista de las diferentes opciones que tenemos para visualizar los procesos. Lo que más nos interesa son dos teclas: la F y la k (recordad que el terminal diferencia entre mayúsculas y minúsculas). La tecla F nos permite ordenar los procesos por una de las columnas, al pulsarla se nos mostrará una lista con las diferentes opciones que hay para ordenar los procesos y la tecla k mata un proceso introduciendo su PID.

Por defecto top ordena los procesos por uso de CPU por lo tanto si el sistema se ha vuelto lento porque el proceso nos esta consumiendo todo el tiempo de la CPU lo veremos arriba del todo. Si no lo vemos entonces podemos ordenar la lista por consumo de memoria pulsando F, despues n y enter.

Una vez hemos localizado el proceso nos fijamos en la primera columna y vemos su PID. A continuación pulsamos la tecla k, introducimos el PID y pulsamos enter. Con suerte el sistema vuelve a la normalidad en unos pocos segundos.

¿Que pasa si el proceso que esta colgado es gnome-shell?

En este caso, primero debemos matar el proceso desde un terminal usando top, killkillall. Si usamos killall el comando seria el siguiente:

[usuario@equipo ~]$ killall gnome-shell

Después de haber matado el proceso tenemos que lanzar Gnome Shell, pero si lo hacemos tecleando directamente el comando desde una tty obtendremos el siguiente error:

[usuario@equipo ~]$ gnome-shell
Error del gestor de ventanas: Unable to open X display

Este error se debe a que no le hemos especificado el display en el cual esta la sesión de las X. Además de indicarle el display en el que esta el servidor de las X tenemos que ejecutar gnome-shell en segundo plano, de lo contrario tendremos que mantener abierta la tty. La forma correcta sería:

[usuario@equipo ~]$ gnome-shell -d :0 &

Si todo fue bien ya podremos cerrar el tty y volver al entorno gráfico para seguir trabajando.

En la próxima entrada explicaré como matar la sesión de un usuario y reiniciar el ordenador de forma segura (por supuesto evitando pulsar el botón de reset ^_^ ).