Gestión de procesos y memoria

Rafa Morales 12 Septiembre 2013
9min
0
Linux

Propiedades de los procesos

Básicamente, un proceso o tarea en Linux tiene las siguientes propiedades:

  • Un PID (identificador de proceso), es necesario para referirnos a un proceso en concreto de los varios en ejecución.

  • Un PPID (Identificador del proceso padre), es el número que indica qué proceso creó al proceso en cuestión.

  • Un estado, habrá momentos en los que un proceso seguirá existiendo en el sistema, pero no estará haciendo nada realmente. Puede estar esperando a que una señal le sea enviada para volverse activo, o a nosotros como usuarios nos puede interesar detenerlo o pausarlo bajo determinadas circunstancias. Los estados más importantes son dormido (S), y en ejecución (R).

  • Un dueño, generalmente es el usuario que lo ejecutó, y como ya se dijo, el proceso hereda los permisos del usuario de cara al sistema de ficheros. Si un ejecutable es SUID, al ejecutarse, el proceso resultante adquiere los permisos del usuario dueño del archivo. Generalmente, un usuario normal no puede ejercer control sobre procesos que no le pertenecen.

  • Una prioridad que determina su importancia, ya que no todos los procesos son igual de importantes.

 

Monitorización de procesos

pstree

Con este comando podemos ver las tareas y sus subtareas en una estructura anidada. Con el parámetro –p se muestran también los PIDs de los procesos.

pstree

 

ps

Este comando muestra una lista de los procesos en ejecución en un instante dado.

ps -u

Muestra los procesos que pertenecen al usuario actual.

ps -aux

Muestra la información detallada de todos los procesos en ejecución (a para todos los procesos, u para los procesos del usuario y x para los procesos que no son de terminal).

Los campos más importantes mostrados por ps son:

  • USER - usuario dueño del proceso.

  • PID - número identificador del proceso.

  • %CPU - porcentaje de uso del microprocesador por parte de este proceso.

  • %MEM - porcentaje de la memoria principal usada por el proceso.

  • VSZ - tamaño virtual del proceso (lo que ocuparía en la memoria principal si todo él estuviera cargado, pero en la práctica en la memoria principal sólo se mantiene la parte que necesita procesarse en el momento).

  • RSS - tamaño del proceso en la memoria principal del sistema (generalmente son KBytes, cuando no lo sea, se indicará con una M detrás del tamaño).

  • TTY - número de terminal (consola) desde el que el proceso fue lanzado. Si no aparece, probablemente se ejecutó durante el arranque del sistema.

  • STAT - estado del proceso (R run, T stopped, S signal wait...).

  • START - cuándo fue iniciado el proceso.

  • TIME - el tiempo de CPU (procesador) que ha usado el proceso.

  • COMMAND - el comando que inició el proceso.

 

top

Es la versión a tiempo real de ps. Si lo ejecutamos en una terminal y sin opciones, aparecerá arriba información del sistema: usuarios, hora, información del tiempo de funcionamiento de la máquina, número de procesos, uso de CPU, uso de memoria y uso del swap. A continuación tenemos una lista de procesos similar a la que nos mostraba ps con la diferencia de que esta se actualiza periódicamente, permitiéndonos ver la evolución del estado de los procesos.

top

 

También podemos filtrar la información de salida por usuario:

top –u usuario

 

htop

Es la versión mejorada del comando top, con barras que muestran el estado de la CPU y los procesos. Necesita instalación previa.

apt-get install htop

htop

 

iotop

Muestra a tiempo real la lectura y escritura en disco de cada proceso. Mediante las flechas derecha e izquierda cambiamos la columna por la que deseamos ordenar la lista. Con la tecla "a" se ordena de mayor a menor la columna.

iotop

 

fuser

Este comando ofrece los PIDs de los procesos que están utilizando un archivo en concreto.

fuser -m /dev/sda1

 

Tareas en primer y segundo plano

El control de tareas es una interesante característica que Bash nos ofrece. Así, cada proceso que se ejecute tiene asignado un número de tarea por parte de Bash (diferente al PID).

Las tareas que podemos ejecutar desde una línea de comandos pueden estar en primer o segundo plano, y de hecho pueden pasar de un estado a otro. Una terminal concreta está bloqueada cuando un proceso está en primer plano, mientras que si está en segundo plano la terminal está libre y podemos teclear comandos en ella. Esto está más relacionado con la terminal (Bash) en sí que con el concepto de proceso o tarea. Normalmente al ejecutar un comando no recuperamos el prompt hasta que éste no termina. La necesidad que nos surge es poder usar esa terminal sin abrir otra nueva a la vez que nuestro comando sigue haciendo lo que tenga que hacer.

Cada vez que al presionar INTRO hay novedades en la gestión de tareas, Bash nos informa de ello, mostrando entre corchetes el número de tarea y qué ha ocurrido con ella.

Por defecto, una tarea en segundo plano enviará su salida a la terminal actual. Podemos usar las redirecciones para evitarlo.

 

&

En Bash, ponemos un proceso en segundo plano añadiendo un “&” al final del comando. El comando se ejecuta mientras la terminal queda libre. Una vez ejecutada la tarea nos indica entre corchetes el número de tarea y a continuación el PID del proceso. Si la terminal se cerrar el proceso se terminaría también.

$ sleep 10 &
[1] 6190
$ (tras 10 segundos presionamos INTRO)
[1]+ Done sleep 10

 

nohup

Sirve para ejecutar cualquier comando sin que éste dependa de la terminal. Para ello hay que indicar las redirecciones de entrada y salida estándar, si no el mismo programará te indicará cuáles está utilizando.

nohup sleep 10 &> salida.log &
nohup ls –R /etc &> salida.log

 

jobs

Muestra una lista de los trabajos en ejecución en la terminal.

jobs

 

fg

Con este comando recuperamos una tarea de segundo plano o parada a primer plano, para ello deberemos seguirlo de %N, donde N es el número de tarea que queremos recuperar.

fg %2

 

Ctrl + Z

Con esta combinación detendremos la tarea que se encuentre actualmente en primer plano.

$ ls / -r
...
(Ctrl + Z)
[2]+ Detenido ls / -r

 

bg

Con este comando pasamos una tarea parada a segundo plano y se activaría para continuar su ejecución, deberemos seguirlo de %N, donde N es el número de tarea que queremos activar.

bg %2

 

Ctrl + C

Cancela totalmente una tarea o proceso que se encuentre en primer plano ejecutándose actualmente.

 

kill

Este comando sirve para enviar una señal a un proceso, deberemos indicar la señal enviada y el PID del proceso al que deseamos enviar la señal. El tipo de señal se indica mediante una palabra asociada al mismo o con un código numérico en aquellas señales más utilizadas. Los más conocidos son:

TERM (15): Manda una señal para terminar de una manera limpia un proceso, esperando a que guarde sus datos, para ello el proceso debe de estar preparado para aceptar este tipo de señal. Esta será la señal por defecto si no se indica ninguna.

kill 9156
kill –TERM 9156
kill -15 9156

KILL (9): Manda una señal de terminar incondicionalmente, sin esperar a que el proceso guarde sus datos.

kill –KILL 9156
kill –9 9156

STOP: Manda una señal de detener a un proceso.

kill –STOP 9156

Si en lugar de indicar un PID se puede indicar -1 para que afecte a todos los procesos al alcance del usuario. Si somos root detendremos el sistema.

kill –9 -1

 

nice / renice

Sirve para modificar la prioridad por defecto de los procesos del sistema. La prioridad va desde el valor -20 (priodad más favorable) al valor 19 (prioridad menos favorable).

La prioridad de un proceso la podemos conocer mediante la columna NI del siguiente comando:

ps –l
ps -axl

Con el comando sin parámetros obtenemos el valor por defecto de la prioridad con la que ejecutamos los comandos:

nice

Para lanzar un proceso con una determinada prioridad utilizamos el siguiente comando:

nice –n 15 sleep 10
nice –n -8 sleep 10

Para modificar la prioridad de un proceso que ya está en ejecución utilizamos su PID:

renice -15 8180
renice 10 8182

 

Monitorización de memoria

free

Proporciona información relativa a la cantidad de memoria física y swap, tanto libre como usada en el sistema, el estado de los buffers y la memoria caché utilizada por el núcleo. Con el parámetro –m se muestra en megabytes.

free -m

 

pmap

Proporciona información referente a la utilización de memoria por parte de un determinado proceso. Hay que indicarle el PID del proceso.

pmap 1732

 

vmstat

Informe gráfico que contiene las estadísticas de la memoria.

vmstat

 

/proc/meminfo

Fichero de texto con la información de la memoria a tiempo real.

cat /proc/meminfo