domingo, 17 de agosto de 2008

Trabajando con Procesos

Que es un proceso
Un proceso es, en resumen, un programa en ejecución.Todos los comandos ejecutados acaban de una forma u otra, por generar un proceso que realiza la tarea. La shell que usamos para interactuar con el sistema también es un proceso. De hecho, la shell es un buen ejemplo para entender las relaciones de parentesco entre procesos.

En caso de no ser un comando interno, la shell ejecuta el comando necesario para llevar a cabo la tarea, invocando un nuevo proceso. Este nuevo proceso se le conoce como proceso hijo (en relación a nuestra shell) y la propia shell es el proceso padre (de ese proceso hijo).

Cuando el proceso ha acabado de realizar su tarea, devuelve los resultados al proceso padre y finaliza su ejecución. El proceso hijo puede necesitar invocar otro proceso donde delegar parte de
la tarea, convirtiéndose a su vez, en el proceso padre del proceso recién invocado. En los sistemas
multitarea como GNU/Linux, los procesos pueden llegar a desarrollar auténticos árboles genealógicos, ya que los procesos pueden se padres e hijos y además, varios procesos pueden ser
hijos del mismo proceso padre a la vez.

Los demonios
De los diferentes procesos que pueden estar ejecutándose en un sistema GNU/Linux, esto es, procesos invocados por el usuario, procesos invocados por otros usuarios y procesos invocados por el sistema operativo, los últimos son los más especiales y se les conoce como demonios (daemons).
Los demonios son procesos que el sistema operativo invoca para proporcionar servicios. Una característica de los demonios es que no suelen interactuar mucho. Proporcionan la funcionalidad para la que están programados de manera silenciosa, al menos en cierta forma, puesto que la gran mayoría utilizan ficheros de log para registrar sus transacciones. Entre los demonios más comunes están los de impresión, los de correo, los de periodicidad de tareas y monitorización. Pero hay muchos más.

Trabajando con ps
El comando ps da información sobre los procesos corriendo sobre el sistema. Invocado de la manera más sencilla:

$ ps

Devuelve un listado con los procesos que se lancen con el usuario actual y que aún se están ejecutando. En la última línea aparecerá el proceso que representa a ps, ya que es el último proceso lanzado.

PID TTY TIME CMD
4321 pts/2 00:00:00 bash
4356 pts/2 00:00:00 ps

Echando un vistazo al resultado:
  • La primera columna, marcada como PID, representa el identificador de proceso (Process ID, PID). Este identificador de proceso se asigna desde cero hasta un límite marcado por el propio sistema operativo. Cuando el identificador llega a ese límite, vuelven a asignarse los identificadores libres empezando otra vez desde cero.
  • La segunda columna indica la terminal asociada al proceso. Hay procesos que no tienen asignada terminal (demonios...), estos aparecen marcados con un signo de interrogación (?) en esta columna.
  • La tercera columna indica el porcentaje de tiempo de procesador que el proceso está usando. Normalmente, los procesos ejecutan sus tareas muy rápidamente, durante intervalos cortos. Luego se mantienen a la espera. Un proceso que muestre lecturas altas en esta columna puede repercutir en el rendimiento del resto del sistema.
  • La cuarta columna es el nombre del proceso (el nombre del comando). La primera línea es siempre la shell sobre la que se ejecutan los procesos. A esta shell (de hecho al primer proceso del usuario) se le llama líder de sesión (session leader).

A ps se le llama frecuentemente de las siguientes formas:
$ ps -a
Devuelve el listado de todos los procesos sin incluir al líder de sesión ni los procesos sin terminal
asociada.
$ ps -e
Devuelve el listado de todos los procesos. La opción -e es sinónimo de la opción -A.
$ ps -l
Devuelve un listado extendido. Con información sobre UID's (identificadores de usuario o User
ID's, marcado como UID), los PID's del proceso padre (marcado como PPID), información sobre si
el proceso entra en las expectativas de planificación de procesos del kernel (marcado como C), o la fecha de inicio del proceso (marcado como TIME). Hay que destacar que en este formato, el
nombre del proceso se sustituye por la cadena entera entrada con la que se lanzó el proceso, con
parámetros, opciones y argumentos (marcado como CMD).

Por ultimo
$ ps -u root
Devolverá todos los procesos que ha lanzado el usuario especificado tras el parámetro -u (en el ejemplo debe sacar información sobre los procesos invocados por root o por el sistema).

pstree y top
Existen dos comandos relacionados con el comando ps que ofrecen una vista de los procesos ligeramente diferente a como lo hace ps.
El primero de ellos es pstree, que ofrece una visualización gráfica (aunque en modo texto) de las relaciones que existen entre los procesos:



El segundo comando relacionado con ps es top. Éste comando, no sólo muestra los procesos actuales, sino que automáticamente se va actualizando para mostrar los cambios acontecidos. Adicionalmente, en la parte superior se muestra información sobre el número de días que ha estado la maquina en marcha, el número de usuarios, la memoria, estadísticas de la memoria de
intercambio, etc.
Mientras el comando top está en marcha, se pueden usar las siguientes teclas para interactuar con él:
h Ayuda
q Salir
s Cambia el tiempo entre actualizaciones (por defecto, 5 segundos)
espacio Actualizar ahora en lugar de esperar al siguiente intervalo de actualización
u Muestra un único usuario:


Robot's