LPIC-1 Tema 103.5: crear, monitorizar y matar procesos
Nueva entrada dedicada a los exámenes de las certificaciones LPIC-1, con el Tema 103.5 dedicado a la gestión básica de los procesos. Concretamente a crear, monitorizar y matar procesos desde GNU/Linux, ya que en las preguntas sobre este tema se te evalúa para ver si dispones de las competencias básicas para poder ejecutar tareas en primer y segundo plano, enviar señales a procesos corriendo, monitorizar la actividad del sistema, etc.
Para ello se van a necesitar un buen numero de herramientas que son las que voy a describir aquí. Pero antes deberías tener claro qué es un proceso, si existe alguna diferencia entre proceso y programa, o las diferencias entre un proceso y un LWP o proceso ligero (también conocido como hilo, hebra o thread)…
ÍNDICE:
Proceso, programa, hebra
Resumiendo mucho, para no extenderme, lo que necesitas saber sobre estos conceptos es:
- Proceso: un proceso es una tarea o programa en ejecución que el kernel del sistema operativo puede gestionar. A él se asocia un espacio de direcciones de memoria que le permitirá leer y escribir, con unos límites para no interferir en otros procesos cargados en memoria. Dentro de ese espacio tendrás las instrucciones o código del programa y los datos (constantes, variables,…) y su pila. El scheduler del kernel gestionará esos procesos para que la CPU los vaya procesando. Dentro de la CPU, cuando comienza a procesar uno de estos procesos, se le asignará un conjunto de registros, como el PC (Program Counter), un SP (Stack Pointer), etc., y se irán enviando los datos a distintas unidades funcionales para su ejecución… Deberías saber también que en Linux tienes una interfaz en la que puedes tener acceso a muchos datos de los procesos en marcha, y es en /proc. Además, cada uno tendrá un identificador PID asignado o un Process ID. Y aunque lo he comentado ya, también recordar que todos los procesos colgarán desde el PID=1, es decir, el primer proceso (init, systemd, upstart,…).
- Programa: un programa tal como lo entienden la mayoría de usuarios puede ser un proceso o varios procesos, ya que no todos el software se puede ejecutar solo con un proceso. Pero en muchos casos, cuando gestiones los procesos en Linux con las herramientas del siguiente apartado, verás que proceso=programa.
- Hebra: básicamente un hilo, hebra o thread es un subproceso. Es decir, si un programa ha sido creado para poner en marcha varios hilos y la CPU esta preparada para ejecutar varios hilos a la vez (multithreading), podrán procesarse simultáneamente. Si un proceso se divide en varios hilos, el proceso no terminará de ejecutarse hasta que todos los hilos se hayan ejecutado (hasta ese momento no se liberan los recursos de hardware ocupados). Para el kernel y la CPU, los hilos se tratarán como si fuesen procesos. De hecho, se componen también de instrucciones y datos, solo que todos los hilos que pertenezcan a un mismo proceso compartirán el espacio de memoria y varios otros recursos. En Linux, estos threads se denominan LWP (Light-Weight Process) o proceso ligero…
Para más información, te invito a leer la serie de artículos de Programación de este blog…
/proc/<PID>/
El directorio /proc, que ya he comentado sobre él en otros artículos, también es muy importante para el tema de procesos. De hecho, es una interfaz que se usa para permitir el acceso a la información del núcleo sobre los procesos que mantiene.
Cada proceso tendrá un subdirectorio dentro de éste referenciado con su PID. Es decir, puedes encontrarte con directorios tipo /proc/1/, para el proceso PID=1. El contenido de cada uno de ellos es muy interesante y aportan información de los procesos:
- /proc/<PID>/cmdline: contiene el comando o programa que originó el proceso.
- /proc/<PID>/cwd: enlace simbólico al directorio de trabajo del proceso.
- /proc/<PID>/environ: contiene nombres y valores de variables de entorno para dicho proceso.
- /proc/<PID>/exe: enlace simbólico hacia el ejecutable original.
- /proc/<PID>/fd: enlace simbólico para el file descriptor o descriptor de fichero.
- /proc/<PID>/fdinfo: directorio con entradas que describen la posición y flags para el descriptor.
- /proc/<PID>/maps: fichero de texto con información sobre el mapeado de ficheros y bloques.
- /proc/<PID>/mem: binario que representa la memoria virtual para el proceso.
- /proc/<PID>/root: enlace simbólico para el path root del proceso.
- /proc/<PID>/status: información básica del estado y uso de memoria del proceso.
- /proc/<PID>/task: contiene enlaces duros para cualquier tarea.
Algunos comandos básicos que se usan en la gestión de procesos obtienen su información precisamente de estos ficheros.
Herramientas necesarias
Dentro de las herramientas necesarias que deberías conocer para la gestión básica de procesos, están…
&
El símbolo & tras cualquier comando hará que se ejecute en un segundo plano. Verás que aparece un número de tarea y un PID del proceso. Pero no se mostrará nada más en la stdout, pero se estará ejecutando aunque no lo veas. Por ejemplo:
#Ejecutar top en segundo plano. top &
bg
Tiene el mismo efecto que &, y es poner en segundo plano un determinado proceso. Puedes gestionarlo usando el JOB_ID, ya que en el caso de bg y fg no usan el PID.
#Ejecutar top en segundo plano. bg top
fg
fg (foreground) reanuda una tarea que estaba suspendido (usando Ctrl+Z) o en segundo plano (background). Si has usado & o bg para llevar un proceso a segundo plano, lo podrás traer al frente. Por ejemplo:
#Traer al frente o reanudar la tarea 1 fg %1 #Traer al frente o reanudar la última tarea fg %% #Traer al frente o reanudar un proceso que coincida con el patrón top fg %top
jobs
Es la herramienta para listar los procesos que se están ejecutando en primer o segundo plano. Al ejecutar & o bg habrás visto que aparece un job_id, pues con éste comando podrás ver la lista de tareas en marca y el ID asignado a cada una:
#Listar las tareas con el ID jobs -l
kill
Aunque siempre se le relacione con matar a procesos, el comando hace mucho más que eso. Puede enviar cualquier señal a un proceso en marcha. Con las señales que tienes a tu alcance se puede matar, interrumpir, pausar, etc.
#Matar a un proceso en marcha para que se interrumpa y deje libres los recursos de hardware asignados. En este caso mata al proceso con PID=4444 o su JOB_ID: kill 4444 kill %4 #Para actuar sobre varios procesos a la vez kill 4444 100 8 #Listar todas las señales que se pueden usar kill -l #Si no se especifica señal se usa por defecto la 9 o SIGKILL para matar. Pero también puedes designarla kill -9 4 #Si quieres suspender y reanudar un proceso PID=5. Si lo deseas, en vez de 19 y 18 puedes usar el nombre de la señal -SIGCONT -SIGSTOP kill -19 5 kill -18 5
nohup
Permite que un proceso se mantenga en ejecución incluso si sales del terminal (logout). Dicho de otro modo, hace que se ejecute de forma independiente a la sesión, ignorando la señal HUP.
#Ejemplos con nohup nohup ./miscript.sh & nohup du -ah
ps
Process Status es una herramienta muy potente para listar los procesos e información sobre ellos. Aparecerán varias columnas de información. Por ejemplo, PID (Process Identifier), TTY (terminal de control), STAT (aparece la letra correspondiente al estado del proceso), TIME (Tiempo de CPU empleado), COMMAND (programa), UID (ID del usuario al que corresponde el proceso), PPID (PID del proceso padre), PGID (ID del grupo al que pertenece), PRI (prioridad del proceso), NI (valor de bondad o prioridad / véase nice), etc.
Me gustaría agregar que en Unix/Linux hay varios estados en los que puede permanecer un proceso. Las letras correspondentes son: R (en ejecución), D (no se peude interrumpir, dispositivos E/S), S (dormido a la espera de que suceda un evento para despertar y continuar ejecutándose), s (líder de sesión), T (terminado), y Z (zombie, un proceso que terminó, está muerto, pero mantiene los recursos de hardware aún secuestrados), aunque también aparecerán dos símbolos extra como N (prioridad por debajo de lo normal) y > (prioridad mayor de lo normal).
Algunos ejemplos con ps son:
#Muestra nuestros procesos ps #Muestra información, por ejemplo temporal, de un proceso por su PID ps -p 8844 -o etime #Muestra los procesos del usuario llamado ejemplo ps -u ejemplo #Muestra todos los procesos menos los de root ps -u root -N #Ver información detallada de todos los procesos ps aux #Si solo quieres ver los resultados correspondientes a Firefox de mi usuario, se puede filtrar ps -u isaac -fL | grep firefox
top
La herramienta top es muy similar al anterior, muestra información de los procesos en marcha. La diferencia es que ps muestra una captura estática de los procesos en el momento de la consulta, mientras que top es interactivo y mostrará los valores en tiempo real.
#Muestra nuestros procesos en tiempo real top
free
Es una herraminta que sirve para mostrar la cantidad de memoria libre y usada en un sistema (RAM, buffer consumido por el kernel, cache y SWAP). Por ejemplo:
#Muestra la memoria libre y usada del sistema free #Lo muestra pero en GB (Gigabytes) free -g
uptime
Puedes consultar el tiempo en el que el sistema se ha estado ejecutando con uptime. El tiempo de inactividad se conoce como downtime.
#Mostrar tiempo de actividad, usuarios, y también carga media del sistema uptime
pgrep
Similar a grep pero para procesos. Fue escrito para Solaris, y sirve para devolver el PID del proceso que corresponde a un patrón o expresión regular que hayas introducido.
#Para saber cuál es el PID de Firefox pgrep firefox #Listar todos los procesos de un grupo john pgrep -l -G john #Igual para un usuario pgrep -l -u isaac
pkill
Similar a kill pero usando un patrón. Es decir, en vez de usar el PID del proceso, puedes directamente usar su nombre si te resulta más intuitivo.
#Matar al demonio httpd pkill httpd #Matar al proceso de nano pkill nano
killall
Es una herramienta capaz de enviar las señales a todos los procesos que se correspondan con el patrón o nombre y sus hijos.
Hay otras como xkill para sesiones gráficas, matando tocando la ventana con el cursor del ratón, skill para actuar sobre sesiones de usuario activas, etc.
#Matar todos los procesos que coincidan con google-chrome killall google-chrome #Listar señales compatibles killall -l #Usar una señal específica killall -9 gedit
watch
Ejecuta un programa periódicamente. Ideal para programar la ejecución de procesos:
#Ejecutar cada 5 min (300s) el comando df -h watch -n 300 df -h #Ejecutar ls cada medio minuto y almacenar la salida en un fichero de texto watch -n 30 ls -l /home > listado.txt
Más adelante veremos otros como renice, nice, time, etc., que también tienen mucho que ver con ésto…
Pingback: LPIC-1 Tema 103.6: modificar la prioridad de procesos en ejecución | ArchiTecnologia