jueves, 17 de julio de 2014

Administrar procesos desde la consola de Linux

Una de las actividades más habituales al momento de administrar un sistema son las que están relacionadas con la manipulación de los procesos que están corriendo en él, dado que existe la necesidad de ejecutarlos, detenerlos, conocer su estado, entre otras tareas.

No está demás recordar que en los sistemas basados en UNIX como por ejemplo Linux , un proceso es un programa en ejecución que tiene unas caraterísticas como un identificador de proceso conocido como PID, un propietario que corresponde al usuario que lo ejecutó, y otras características mucho más técnicas como un segmento de memoria, una pila de instrucciones, entre otras.

Desde la línea comandos Linux provee una seríe de comandos que nos permiten conocer en todo momento información de los procesos que están ene ejecución y que nos permiten manipularlos, en esta entrada vamos a dar un breve repaso por algunos de ellos.

Conocer los procesos que se están ejecutando

Para saber que procesos se están ejecutando solo basta con ejecutar el comando ps para obtener una lista de los procesos que se están ejecutando con nuestro nombre de usuario, es decir, de los que somos propietarios:

juancho@regulus:~$ ps
PID TTY          TIME CMD
27501 pts/0    00:00:00 bash
27596 pts/0    00:00:00 ps


Para conocer todos los procesos de todos los usuarios solo basta con ejecutar  el comando ps con el argumento -A y si queremos obtener más información debemos usar los parámteros -ef:

El núcleo de Linux maneja los procesos con base a un sistema de herencias, es decir, un proceso puede crear a otros los cuales se conocen como hijos los cuales heredan muchas de sus características. Para obtener una imagen de los procesos que se están ejecutando en forma de árbol dónde se ve la relación de procesos padres e hijos se usa el comando pstree el cuál nos da una salida como esta:

Árbol de procesos en ejecución en un sistema Linux
Árbol de procesos en ejecución en un sistema Linux
Si lo que necesitamos es información de un proceso en concreto podemos recurrir al comando pgrep que nos devuelve el PID siempre y cuando el procesos que se busca esté en ejecución:

juancho@regulus:~$ pgrep bash
27762

Si por el contrario conocemos el PID del proceso entonces debemos ejecutar pgrep -P. Sin un programa se está ejecutando varias veces se generará un proceso por cada instancia del mismo por lo cual es aconsejable ejecutar pgrep -l para que liste todos los procesos que se están ejecutando bajo un mismo nombre:

juancho@regulus:~$ pgrep -l lampp
28103 /opt/lampp/bin/
28128 /opt/lampp/bin/
28525 /opt/lampp/bin/
28526 /opt/lampp/bin/
28527 /opt/lampp/bin/
28528 /opt/lampp/bin/
28529 /opt/lampp/bin/

Además del PID podemos conocer otras características usando los demás parámetros de pgrep, los cuales podemos conocer ejecutando pgrep -h.

Si necesitamos obtener información más detallada de un proceso y de los recursos que utiliza, Linux provee algunos comandos útiles para auditorias y análisis forenses por ejemplo.

El comando pmap nos permite conocer la memoria que está consumiendo y las librerías, archivos y procesos que está utilizando:

juancho@regulus:~$ pgrep bash
28576
juancho@regulus:~$ pmap 28576
28576:   bash
0000000000400000    956K r-x-- bash
00000000006ee000      4K r---- bash
00000000006ef000     36K rw--- bash
00000000006f8000     24K rw---   [ anon ]
00000000013de000   2168K rw---   [ anon ]
00007f8cfe12d000     44K r-x-- libnss_files-2.19.so
00007f8cfe138000   2044K ----- libnss_files-2.19.so
00007f8cfe337000      4K r---- libnss_files-2.19.so
00007f8cfe338000      4K rw--- libnss_files-2.19.so
00007f8cfe339000     44K r-x-- libnss_nis-2.19.so
00007f8cfe344000   2044K ----- libnss_nis-2.19.so
..
..
..

Terminar (matar) procesos

Para detener un proceso (matarlo) se debe utilizar el comando kill acompañado del PID del procesos que se desea detener, es importante tener en cuenta que si no somos propietarios del proceso que se desea matar se debe hacer con permisos de root:

juancho@regulus:~$ pgrep -l proftpd
28106 proftpd
juancho@regulus:~$ sudo kill 28106
[sudo] password for juancho: 
juancho@regulus:~$ 

Si por alguna circunstancia el proceso no se detiene se puede usar la orden kill -9 que fuerza la detención del proceso, el uso de esta orden es recomendable solo en situaciones extrictamente necesaria ya que se puede dejar un Proceso Zombie que puede ocasionar efectos secundarios en el sistema. Si se quiere detener un listado de procesos con el mismo nombre pero con diferente PID se debe usar la orden killall acompañada del nombre común de esos procesos, por ejemplo killall apache2 mata todas las instancias del programa apache2, si se desea que aparezca una confirmación antes de hacerlo se le debe añadir el parámetro -i.

Manipulación de procesos

Si por alguna razón necesitamos que un proceso se ejecute en segundo plano para que nos deje libre el interprete  para seguir ejecutando otros comandos, solo basta con ejecutar el comando que necesitamos correr seguido de un & que envía el proceso a segundo plano, por ejemplo:

juancho@regulus:~$ sudo  nano /boot/grub/grub.cfg&
[6] 29071
juancho@regulus:~$

Si en el ejemplo anterior no se hubiera enviado a segundo plano el programa nano se abriría, con lo cual no podría seguir ingresando comandos en el shell hasta que lo cierre. Al enviarlo a segundo plano como se aprecia en el ejemplo puedo seguir ingresando comando en el intérprete.

Para conocer que programas se están ejecutando en segundo plano solo basta con ejecutar el comando jobs:

juancho@regulus:~$ jobs
[1]   Ejecutando              sudo gedit /etc/network/interfaces &
[2]   Detenido                sudo nano /etc/network/interfaces
[3]   Detenido                sudo nano /etc/network/interfaces
[4]   Detenido                sudo nano /etc/network/interfaces
[5]-  Detenido                sudo nano /etc/network/interfaces
[6]+  Detenido                sudo nano /boot/grub/grub.cfg
juancho@regulus:~$ 

Como se puede apreciar en los ejemplos cada proceso en segundo plano está identificado con un número que se ve entre corchetes, este número se utiliza para manipular cada tarea. Por ejemplo con el comando fg 1 traigo el proceso [1] a primer plano, con el comando bg lo puedo enviar de nuevo a segundo plano.

Conclusiones

Manipular los procesos en ejecución es una de las tareas esenciales de los administradores de sistemas ya que permite realizar auditorias sobre el sistema, mejorar su performance, solucionar problemas y conflictos, o simplemente tener un mayor control sobre el sistema.

Los comandos presentados en esta entrada no son los únicos que nos provee Linux para tales fines pero son los que mínimanente un buen administrador de sistemas debe conocer. Existen comandos un poco más avanzados como nice o renice por ejemplo que permiten manipular parte de los recursos asignados a un proceso, pero como el fin de esta entrada es más introductorio los dejaremos para futuras ocasiones.