Procesos en linux. Información y administración

Un programa es un código que está guardado en nuestro ordenador a la espera de ser ejecutado. Cuando esto se produce se crea un proceso que para funcionar necesita consumir recursos del sistema (memoria, procesador, etc..).

Un mismo programa puede dar lugar a múltiples procesos, y éstos podrán estar en diversos estados debido a que sólo puede haber uno ejecutándose en cada núcleo de la CPU.

Linux es un sistema operativo multitarea, por lo que habrá muchos procesos funcionando al mismo tiempo y cada uno querrá consumir todos los recursos del sistema que necesita. El sistema operativo es el encargado de conceder los recursos hardware a cada uno los procesos, pero el administrador del sistema tiene mecanismos para consultar o modificar los procesos en ejecución.

A cada proceso se le asigna un identificador único (PID) de esta forma podremos referirnos a él sin posibilidad de confusión con ningún otro. También tendrá otros datos asociados como el PID del padre (PPID del proceso que lo creó), tiempos de consumo de recursos, cantidad de memoria ocupada, comando que se usó para lanzar el proceso, etc..

1 Obtener información sobre los procesos

1.1 PS

Muestra información sobre los procesos en ejecución. Según las opciones que le indiquemos muestra más o menos información. Las columnas más destacadas son:

  • p o PID: Process ID, número único o de identificación del proceso.
  • P o PPID: Parent Process ID, padre del proceso
  • U o UID: User ID, usuario propietario del proceso
  • t o TT o TTY: Terminal asociada al proceso, si no hay terminal aparece entonces un ‘?’
  • T o TIME: Tiempo de uso de cpu acumulado por el proceso
  • c o CMD: El nombre del programa o comando que inició el proceso
  • RSS: Resident Size, tamaño de la parte residente en memoria en kilobytes
  • SZ o SIZE: Tamaño virtual del proceso
  • NI: Nice, valor nice (prioridad) del proceso, un número positivo significa menos tiempo de procesador y negativo más tiempo (-20 a 19)
  • C o PCPU: Porcentaje de cpu utilizado por el proceso
  • STIME: Starting Time, hora de inicio del proceso
  • S o STAT: Status del proceso, estos pueden ser los siguientes:
    • R runnable, en ejecución, ejecutándose
    • S sleeping, proceso en ejecución pero sin actividad o esperando
    • T sTopped, proceso parado, pero puede ser reiniciado
    • Z zombie, proceso que no terminó de manera correcta (no debe haber procesos zombies)
    • D uninterruptible sleep, generalmente asociados con E/S del sistema
    • X dead, muerto, terminado pero que sigue apareciendo (no debe haber)

Una peculiaridad de ps es que acepta opciones en varios formatos: Unix98 (guión seguido de un único carácter), BSD (único carácter sin guión) y GNU largas (dos guiones y una palabra, no se pueden agrupar)

Destacamos las siguientes:

  • e / -A : Muestra todos los procesos de actuales
  • -f, -l, -F, u: Muestra información extra sobre los procesos.
  • -H / f: Agrupan los procesos según su jerarquía
  • -u usuario: muestra solo los procesos de un usuario determinado

Estas opciones se pueden combinar hasta conseguir la información deseada, para más opciones sobre la información de salida puede utilizar ps --help o

1.2 PSTREE

Si se desea ver únicamente la jerarquía de procesos sin más datos adicionales usar el comando pstree.

Nota: El paquete que contiene los comandos pstree y killall es psmisc

1.3 TOP

Para comprobar en tiempo real cómo están consumiendo recursos los procesos del sistema es muy útil el comando top. En primer lugar muestra información relevante sobre el estado del sistema: su carga, cantidad de procesos según su estado, uso de la CPU y cómo está siendo utilizada la memoria. Después muestra en tiempo real información sobre el consumo de recursos de todos los procesos que se están ejecutando. Por defecto ordenará la lista de procesos según el uso actual de CPU.

Una vez dentro podemos pulsar la tecla h para recibir ayuda del uso de las teclas en top, destacamos:

  • k: pide un PID y destruye el proceso
  • r: cambia la prioridad de un proceso
  • s: modifica la velocidad de actualización de los datos
  • M: hace que la lista de procesos se ordene por consumo de memoria
  • q: sale de top

Otros programa similar, pero aún más visual y directo es htop, para monitorizar la entrada/salida y escritura de ficheros existe iotop . Ambos se tendrán que instalar desde los repositorios

1.4 FREE

Proporciona información sobre el uso de la memoria, tanto principal como swap. Se puede usar la opción -h.

1.5 UPTIME

Muestra el tiempo que está funcionando el sistema operativo desde el último reinicio, así como la carga media del mismo en el último minuto, últimos 5 minutos y últimos 15 minutos. Un valor cercano a 1 por núcleo significa que el sistema está rindiendo sobre sus capacidades, menos es que tiene poca carga y más significa que los procesos tienen que esperar para ser atendidos. Un valor “saludable” sería no más de 0.7.

1.6 PGREP

Permite seleccionar los procesos que concuerden con un patrón dado (se comporta como grep). Además, también puede buscar buscar por atributos como el usuario, padre del proceso, terminal donde se ejecuta, etc.

Por defecto nos devuelve los PID de los procesos seleccionados, algo que resulta útil para combinarlos con comandos de gestión de procesos. Si queremos que muestre también el nombre usaremos la opción -l

Ejemplos:

  • pgrep -u alumno tar
    Muestra los procesos que contienen la cadena ‘tar’ y pertenecen al usuario alumno
  • pgrep -l '^a'
    Muestra los PID y el nombre de los procesos que empiecen por a (pgrep es compatible con regex)

Nota: El paquete que contiene los comandos pgrep, pkill, top y uptime es procps

2 Administrar procesos

2.1 KILL

El comando kill sirve para enviar señales a los procesos. Se les puede ordenar que pausen su ejecución, que continúen, que terminen o si no responden a las señales, eliminarlos del sistema (SIGKILL).

La lista de señales se puede consultar con kill -l

Se puede usar el nombre o el número de señal, pero siempre habrá que indicar el PID (uno o varios) de los procesos a los que se les enviará la señal.

Las señales más comunes son:

  • 9 (KILL): mata el proceso.
  • 15 (TERM): le pide el proceso que termine de forma controlada
  • 19 y 20 (STOP): para el proceso, pero no lo cierra. Lo pone en pausa.
  • 18 (CONT): continua un proceso parado.

Ejemplos:

  • kill -STOP 5670
    Envía la señal de parar el proceso con PID 5670
  • kill -9 5670
    Mata el proceso con PID 5670

2.2 PKILL

Funciona Igual que kill, pero en lugar de utilizar el PID se puede utilizar su nombre (compatible con patrones) y otros criterios como el nombre de usuario, etc. Si no se indica la señal (se indica después de un guión), por defecto usa SIGTERM

Ejemplos:

 pkill firefox 
 pkill -STOP -u root tuxracer 

2.3 KILLALL

Funciona de forma similar al comando kill, pero en lugar de necesitar los identificadores de los procesos a los que mandar la señal, lo hace basándose en el nombre del proceso. De esta forma podemos mandar la misma señal a todos los procesos que tengan un nombre igual o similar. Por ejemplo todas las pestañas de un navegador, o los programas de backups o antivirus que puedan estar ejecutándose en segundo plano.

Con la opción -i nos pregunta por cada proceso antes de mandarle la señal y con -r podemos usar expresiones regulares en el nombre del proceso.

Ejemplos:

  • kill -9 chromium
    Mata todos los procesos que se llamen chromium
  • kill -9 5670
    Mata el proceso con PID 5670

3 Procesos en segundo plano

Cuando ejecutamos un comando en el terminal debemos esperar a que termine para poder seguir utilizando el sistema y enviar el siguiente comando. Para instrucciones breves no supone un problema, pero para tareas lentas como copias de seguridad, escaneos o búsquedas implicaría pasar muchísimo tiempo esperando sin poder utilizar el mismo terminal. Una de las soluciones posibles es ejecutar comandos en segundo plano, es decir, el proceso está realizando su tarea, pero el terminal queda libre para seguir ejecutando comandos.

3.1 El carácter &

Si queremos que un comando se ejecute directamente en segundo plano pondremos al final de la orden el carácter &. Por ejemplo: clamscan /home/ > /var/log/clamav.log &

Es importante recordar que si el programa que se va a ejecutar en segundo plano manda información a la salida estándar (al monitor), lo seguirá haciendo, por eso suele ser recomendable redirigirla hacia otro lugar para que no se mezcle con otras salidas.

3.2 JOBS

Cuando enviamos un proceso a que se ejecute en segundo plano se le asocia un número ID (no confundir con su PID), que será un entero consecutivo empezando por el 1. Es relativo a la sesión actual, por lo que si tengo varios terminales abiertos, los números se repetirán en cada uno de ellos (algo que nunca sucede con los PID).

El comando jobs muestra los procesos que se están ejecutando en segundo plano, junto con su identificador. Este número se puede utilizar en lugar del PID para hacer referencia a un proceso. Para que no haya confusión se pone delante del número el carácter %. Por ejemplo: kill -9 %2

También indica con el carácter + el proceso que se verá afectado si ejecutamos los comandos fg o bg.

3.3 FG y BG

Si queremos enviar un proceso a segundo plano pero ya se está ejecutando, podríamos pararlo enviándole una señal, o pulsado CONTROL+Z, después el comando bg (background) haría que se siguiera ejecutando pero en segundo plano. Para continuar y volver a tomar el control del terminal, ejecutaríamos fg (foreground) y el proceso seguiría funcionando en primer plano.

En el caso que queramos ejecutar estos comandos sobre un proceso concreto de la lista que ofrece el comandos jobs (no sobre el que está marcado con un +) podríamos enviar como parámetro el número de su identificador, por ejemplo fg %2

3.4 Nohup

Si ejecutamos una tarea que necesita mucho tiempo y queremos dejarla funcionando sin dejar el terminal abierto, tenemos el problema de que al terminar el proceso padre (el terminal) que lanzó la tarea, también se mandan señales para que terminen todos los procesos hijos. Así que al cerrar el terminal, nuestro proceso terminará también. Si queremos que esto no suceda podemos escribir antes del comando deseado, la orden nohup. Esto hará que dicho proceso ignore la orden de terminar la ejecución (SIGHUP)

Ejemplo: nohup tar -czf /backups/copia.tar.gz /home/

Nota: Para que el sistema envíe el la señal SIGHUP al cerrar sesión tiene que estar activada la opción huponexit => shopt -s huponexit