Gestión de procesos y trabajos

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: https://www.alcancelibre.org

Licencia Creative Commons
© 1999-2026 Joel Barrios Dueñas. Este manual se distribuye bajo la licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional (CC BY-NC-SA 4.0). Usted es libre de compartir y adaptar el material bajo los siguientes términos: debe dar crédito al autor, no puede utilizarlo para fines comerciales y debe compartir las obras derivadas bajo la misma licencia. La licencia completa está disponible en https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.es.

Introducción

En este documento aprenderá el uso de free, jobs, bg, fg, kill, killall, ps, top y taskset. Este manual forma parte de una secuencia didáctica que incluye ejercicios prácticos en clase, alternando entre sesiones como superusuario (root) y usuario regular. Se recomienda completar los manuales previos sobre gestión de cuentas de usuario y mandatos básicos para un mejor aprovechamiento.

Un PID (Process ID) o identidad de proceso, es un decimal entero que especifica un proceso o un grupo de procesos. Todos los procesos que se ejecuten en un sistema pueden ser terminados o aniquilados utilizando kill o bien killall, excepto por el proceso con PID 1, el cual corresponde siempre a /sbin/init.

Un Job ID o identidad de trabajo, identifica un trabajo o grupo de trabajos que se ejecutan en segundo plano. Puede utilizar kill para terminar o aniquilar los trabajos originados de una misma consola o intérprete de mandatos en ejecución.

Los trabajos se gestionan a través de bg, fg y jobs. Los procesos se terminan normalmente con SIGTERM (número de señal 15) o bien se aniquilan con SIGKILL (número de señal 9), utilizando kill o killall.

Procedimientos

Ingrese al sistema como root.

Todos los paquetes necesarios para realizar los procedimientos de este documento deben estar instalados de modo predeterminado, puesto que son componentes críticos para el sistema.

Si utiliza Fedora™ o Red Hat™ Enterprise Linux o sus derivados modernos (AlmaLinux, Rocky Linux), ejecute lo siguiente para instalar o actualizar los paquetes necesarios:

dnf -y install psmisc procps-ng util-linux

Si utiliza ALDOS, ejecute lo siguiente para instalar o actualizar los paquetes necesarios:

yum -y install psmisc procps-ng util-linux

Cierre la sesión como root e ingrese nuevamente al sistema como usuario regular (por ejemplo, fulano) o bien ejecute lo siguiente:

su -l fulano

Uso de free

Se trata de una herramienta que muestra un resumen fácil de entender del contenido de /proc/meminfo. Muestra la cantidad de memoria utilizadas y disponible en el sistema.

De modo predeterminado free muestra la información en escala de KiB. Ejecute lo siguiente:

free

Lo anterior debe devolver una salida similar a la siguiente:

             total       used       free     shared    buffers     cached
Mem:       2956352    2752032     204320          0     159592    1509388
-/+ buffers/cache:    1083052    1873300
Swap:      6291448     167468    6123980

Ejecute lo siguiente para ver la la salida en MiB:

free -m

Lo anterior debe devolver una salida similar a la siguiente:

             total       used       free     shared    buffers     cached
Mem:          2887       2712        174          0        156       1487
-/+ buffers/cache:        <span style="color:darkred;">1068       1818</span>
Swap:         6143        163       5980

La interpretación de ésta última salida indica lo siguiente:

Ejecute lo siguiente para mostrar lo anterior con una fila con los totales en MiB:

free -mt

Lo anterior debe devolver una salida similar a la siguiente:

             total       used       free     shared    buffers     cached
Mem:          2887       2712        174          0        156       1487
-/+ buffers/cache:       1068       1818
Swap:         6143        163       5980
Total:        9031       2876       6154

Puede consultar otras opciones de free a través de su página de manual ejecutando lo siguiente:

man 1 free

Uso de jobs, bg y fg

Ejecute sleep con el valor 600 (pausa por 60 segundos), a fin de utilizar éste como trabajo de ejemplo.

sleep 600

Pulse CTRL+Z, lo cual devolverá una salida similar a la siguiente:

^Z
[1]+  Detenido                sleep 600

Ejecute jobs para visualizar el trabajo detenido:

jobs

Lo anterior debe devolver la siguiente salida:

[1]+  Detenido                sleep 600

Ejecute bg para reactivar el trabajo 1 en segundo plano:

bg 1

La salida deberá devolver lo siguiente:

[1]+ sleep 600 &

Ejecute nuevamente sleep, con el valor 700 y un signo amperson (&) al final:

sleep 700 &

La salida devolverá algo similar a lo siguiente, indicando el número de trabajo (2) y el número de identidad de proceso (PID):

[2] 3768

Con lo anterior habrá enviado este trabajo directamente a segundo plano.

Ejecute jobs para visualizar los trabajos en segundo plano:

jobs

La salida será similar a:

[1]-  Ejecutando              sleep 600 &
[2]+  Ejecutando              sleep 700 &

Ejecute fg con 1 como argumento para enviar a primer plano el primer trabajo:

fg 1

Lo anterior hará que sleep 600 regrese a primer plano.

Para terminar este último trabajo, pulse CTRL+C.

Uso de ps, kill y killall

Ejecute ps con las opciones aux (todos los procesos en todas las terminales, orientado a usuarios e incluyendo todos los procesos con o sin un TTY), utilizando una tubería (|) con less para poder observar cómodamente la salida y los valores de las columnas USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME y COMMAND.

ps aux |less

Ejecute de nuevo lo anterior pero utilizando una tubería (|) y grep para visualizar solamente los procesos cuyo nombre incluyan la cadena sleep:

ps aux |grep sleep

Lo anterior le devolverá una salida similar a la siguiente:

fulano  3768  0.0  0.0 100984   568 pts/2    S    11:50   0:00 sleep 700
fulano  3820  0.0  0.0 103396   832 pts/2    S+   11:51   0:00 grep --color=auto sleep

La segunda columna corresponde al número de identidad de proceso (PID), determine el correspondiente al procesos sleep 700.

Ejecute kill con este número de identidad de proceso, con la finalidad terminar éste de manera normal (SIGTERM).

kill 3768

Lo anterior devolverá la siguiente salida:

[2]+  Terminado               sleep 700

Ejecute de nuevo sleep, ahora con 800 como argumento, con un signo amperson (&) al final, a fin de generar un nuevo trabajo en segundo plano.

sleep 800 &

Lo anterior debe devolver una salida similar a la siguiente:

[1] 3820

La forma más sencilla de terminar de manera normal (SIGTERM) un trabajo es ejecutando kill con el número de trabajo precedido por un signo %, como argumentos. Ejemplo:

kill %1

La salida solo devolverá el símbolo de sistema. Si vuelve a pulsar la tecla ENTER, la salida será similar a la siguiente:

[1]+  Terminado               sleep 800

Ejecute de nuevo sleep con 850 como argumento y un signo amperson (&) al final para generar un nuevo trabajo en segundo plano.

sleep 850 &

Lo anterior debe devolver una salida similar a la siguiente:

[1] 3830

Ejecute nuevamente ps con las opciones aux, agregando una tubería y grep para visualizar en la salida solamente los procesos cuyo nombre incluyan la cadena sleep:

ps aux |grep sleep

Lo anterior le devolverá una salida similar a la siguiente:

fulano  3830  0.0  0.0 100984   564 pts/2    S    11:54   0:00 sleep 850
fulano  3835  0.0  0.0 103396   828 pts/2    S+   11:56   0:00 grep --color=auto sleep

Determine el número de identidad de proceso correspondiente al procesos sleep 850.

Ejecute kill con este número de identidad de proceso, correspondiente a sleep 850, con la finalidad aniquilar éste (SIGKILL).

kill -9 3830

Lo anterior debe devolver la siguiente salida:

[1]+  Terminado (killed)      sleep 850

Ejecute lo siguiente para generar dos nuevos trabajos en segundo plano:

sleep 600 & sleep 700 &

Lo anterior devolverá algo similar a lo siguiente:

[1] 3924
[2] 3925

Ejecute jobs para visualizar ambos trabajos:

jobs

Lo anterior deberá devolver la siguiente salida:

[1]-  Ejecutando              sleep 600 &
[2]+  Ejecutando              sleep 700 &

Ejecute ps, con la opción -j, para visualizar los números de identidad de proceso (PID) de estos trabajos:

ps -j

Lo anterior debe devolver una salida similar a la siguiente:

  PID  PGID   SID TTY          TIME CMD
 3624  3624  3624 pts/2    00:00:00 bash
 3924  3924  3624 pts/2    00:00:00 sleep
 3925  3925  3624 pts/2    00:00:00 sleep
 3937  3937  3624 pts/2    00:00:00 ps

Ejecute killall con la cadena «sleep» como argumento, a fin de terminar de manera normal de todos los procesos denominados sleep.

killall sleep

Lo anterior deberá devolver la siguiente salida:

[1]-  Terminado               sleep 600
[2]+  Terminado               sleep 700

Ejecute lo siguiente para generar dos nuevos trabajos en segundo plano:

sleep 800 & sleep 900 &

Lo anterior devolverá algo similar a lo siguiente:

[1] 3949
[2] 3950

Ejecute jobs para visualizar ambos trabajos:

jobs

Lo anterior deberá devolver la siguiente salida:

[1]-  Ejecutando              sleep 800 &
[2]+  Ejecutando              sleep 900 &

Ejecute ps, con la opción -j, para visualizar lo números de identidad de proceso (PID) de estos trabajos:

ps -j

Lo anterior debe devolver una salida similar a la siguiente:

  PID  PGID   SID TTY          TIME CMD
 3624  3624  3624 pts/2    00:00:00 bash
 3949  3949  3624 pts/2    00:00:00 sleep
 3950  3950  3624 pts/2    00:00:00 sleep
 3956  3956  3624 pts/2    00:00:00 ps

Ejecute killall, con la opción -s y el valor 9, junto con la cadena «sleep» como argumento, a fin de aniquilar (terminación anormal) de todos los procesos denominados sleep.

killall -s 9 sleep

Lo anterior deberá devolver la siguiente salida:

[1]-  Terminado (killed)      sleep 800
[2]+  Terminado (killed)      sleep 900

Uso de nice y renice

Ejecute tar con las opciones Jcf para generar el archivo pixmaps.tar.xz con el contenido del directorio /lib/modules, ejecutando lo siguiente:

tar Jcf modulos.tar.xz /lib/modules

Al terminar utilice time para cuantificar la ejecución de tar con las opciones jxf para descomprimir el archivo modulos.tar.xz. El objetivo será cuantificar la descompresión con la prioridad de planificación 0 (valor predeterminado del sistema), la cual permite utilizar los recursos que regularmente permite utilizar el sistema al usuario.

time tar Jxf modulos.tar.xz

La salida debe devolver algo similar a lo siguiente:

real    0m13.237s
user    0m12.491s
sys     0m1.824s

Ejecute nuevamente time con nice para ejecutar tar con las opciones Jxf para descomprimir el archivo modulos.tar.xz. El objetivo será realizar la descompresión cambiando la prioridad de planificación a 10 ―valor predeterminado de nice― a fin de utilizar menos recursos de sistema.

time nice -n +10 tar Jxf modulos.tar.xz

La salida debe devolver algo similar a lo siguiente:

real    0m13.638s
user    0m12.947s
sys     0m1.908s

Los resultados deberán ser ligeramente mayores que la ejecución con el valor predeterminado de prioridad de planificación (0).

Ejecute nice con la opción -n y el valor 19, para ejecutar tar con las opciones Jxf, con la menor prioridad posible, para descomprimir el archivo modulos.tar.xz. El objetivo será realizar la descompresión cambiando la prioridad de planificación a 19, a fin de utilizar la menor cantidad de recursos posible.

time nice -n +20 tar Jxf modulos.tar.xz

La salida debe devolver algo similar a lo siguiente:

real    0m13.918s
user    0m13.045s
sys     0m1.875s

Los resultados deberán ser sensiblemente mayores que la ejecución con el valor predeterminado de prioridad de planificación (0).

El usuario regular solo pude definir valores de prioridad de planificación del 0 al 19, prioridad de planificación predeterminada a prioridad de planificación menos favorable. Los valores negativos, del -1 al -20, que son los más favorables, sólo los pude utilizar root.

Ejecutando su con la opción -c, con la cual se indicará entre comillas cualquier cosa para ser ejecutada como root, repita lo anterior pero con valor -20 para nice.

su -c "time nice -n -20  tar Jxf modulos.tar.xz"

Lo anterior solicitará se ingrese la clave de acceso de root y devolverá una salida similar a la siguiente:

real    0m13.328s
user    0m12.834s
sys     0m1.978s

Los resultados deberán ser sensiblemente inferiores que la ejecución con el valor predeterminado de prioridad de planificación (0).

Lo anterior generará un directorio denominado lib dentro del directorio de inicio del usuario, pero éste es propiedad de root, por lo cual el usuario regular será incapaz de eliminar. Elimine éste antes de continuar o bien se va a repetir procedimientos.

su -c "rm -fr /home/fulano/lib"

Renice sirve para cambiar la prioridad de planificación de procesos en ejecución por número de proceso, usuario o grupo. Los valores de prioridad de planificación se pueden visualizar utilizando ps con las opciones alx (todos los procesos en todas las terminales, en formato largo e incluyendo todos los procesos con o sin un TTY, respectivamente). Ejecute lo siguiente:

ps alx |less

Lo anterior mostrará las columnas F, UID, PID, PPID, PRI, NI, VSZ, RSS, WCHAN, STAT, TTY, TIME y COMMAND. Los valores de prioridad planificada corresponden a la sexta columna (NI). Para salir pulse la tecla q.

El siguiente ejemplo cambia la prioridad de planificación a -10 al proceso que en el ejemplo corresponde al PID 45678:

su -c "renice -n -10 -p 45678"

El siguiente ejemplo cambia la prioridad de planificación a -10 a todos los procesos del usuario fulano:

su -c "renice -n -10 -u fulano"

El siguiente ejemplo cambia la prioridad de planificación a -10 a todos los procesos del grupo desarrollo:

su -c "renice -n -10 -g desarrollo"

El siguiente ejemplo cambia la prioridad de planificación a -10 al procesos 34567 del usuario fulano:

su -c "renice -n -10 -p 34567 -u fulano"

Uso de taskset

Cambie al usuario root. A partir de este paso sólo podrá realizar los procedimientos con privilegios de root.

Taskset (asignador de tareas) sólo tiene sentido utilizarlo cuando se dispone de más de un CPU lógico en el sistema. Ejecute nproc para determinar el número de CPUs lógicos en el sistema:

nproc

Lo anterior sólo devolverá el número de CPUs lógicos del sistema.

Ejecute lscpu para obtener información más detallada:

lscpu

Asumiendo que el sistema dispone de ocho núcleos lógicos, lo anterior puede devolver una salida similar a la siguiente:

Arquitectura:                            x86_64
  modo(s) de operación de las CPUs:      32-bit, 64-bit
  Tamaños de las direcciones:            43 bits physical, 48 bits virtual
  Orden de los bytes:                    Little Endian
CPU(s):                                  8
  Lista de la(s) CPU(s) en línea:        0-7
ID de fabricante:                        AuthenticAMD
  Nombre del modelo:                     AMD Ryzen 5 2400G with Radeon Vega Graphics
    Familia de CPU:                      23
    Modelo:                              17
    Hilo(s) de procesamiento por núcleo: 2
    Núcleo(s) por «socket»:              4
    «Socket(s)»:                         1
    Revisión:                            0
    Aumento de frecuencia:               activada
    CPU(s) scaling MHz:                  48%
    CPU MHz máx.:                        3600.0000
    CPU MHz mín.:                        1600.0000
    BogoMIPS:                            7186.44
...
Características de virtualización:       
  Virtualización:                        AMD-V
Cachés (suma de todas):                  
  L1d:                                   128 KiB (4 instancias)
  L1i:                                   256 KiB (4 instancias)
  L2:                                    2 MiB (4 instancias)
  L3:                                    4 MiB (1 instancia)
NUMA:                                    
  Modo(s) NUMA:                          1
  CPU(s) del nodo NUMA 0:                0-7
Vulnerabilidades:                        
  Gather data sampling:                  Not affected
  Indirect target selection:             Not affected
  Itlb multihit:                         Not affected
  L1tf:                                  Not affected
  Mds:                                   Not affected
  Meltdown:                              Not affected
  Mmio stale data:                       Not affected
  Reg file data sampling:                Not affected
  Retbleed:                              Mitigation; IBPB; SMT vulnerable
  Spec rstack overflow:                  Mitigation; IBPB
...
  Srbds:                                 Not affected
  Tsa:                                   Not affected
  Tsx async abort:                       Not affected
  Vmscape:                               Mitigation; IBPB on VMEXIT

Lo anterior representa un resumen del contenido del archivo /proc/cpuinfo, que también puede consultarse ejecutando lo siguiente:

less /proc/cpuinfo

Puede utilizar taskset para establecer u obtener la afinidad de CPU de un proceso a través de su PID o bien para ejecutar un nuevo procesos con una afinidad de CPU arbitraria. La afinidad de CPU es una propiedad de planificador del núcleo de Linux (kernel) que vincula un procesos a un conjunto de CPUs en el sistema. Este planificador se encargará de que se mantenga la afinidad de CPU y que el proceso sólo se ejecute en el CPU o en los CPUs especificados. Cabe señalar que de manera nativa el planificador del núcleo de Linux incluye soporte para afinidad natural, la cual consiste en que el planificador intentará mantener los procesos en el mismo CPU tanto como sea práctico para mantener un buen desempeño en el sistema, por lo cual la manipulación de la afinidad de CPU sólo es útil para ciertas tareas y aplicaciones.

Cabe señalar que taskset siempre devolverá un error si se especifica una máscara de bit incorrecta o bien un CPU inexistente.

La afinidad de CPU se representa a través de una máscara de bit (bitmask), donde el bit de menor valor corresponde al primer CPU lógico y el bit mayor corresponde al último CPU lógico. Las máscaras de bit se representan en hexadecimal:

Para iniciar un nuevo proceso con una afinidad de CPU en particular, se utiliza la siguiente sintaxis:

taskset mascara mandato

Ejemplo:

taskset 0x00000001 tar Jcf modulos.tar.xz /lib

Ejecute taskset con la opción -p para indicar que se utilizará un PID existente y el número de PID como argumento ara obtener la afinidad de CPU de un procesos en ejecución:

taskset -p pid

Ejemplo:

taskset -p 34567

Ejecute taskset con la opción -p para indicar que se utilizará un PID existente, la mascara de afinidad de CPU deseada y el número de PID como argumentos ara cambiar la afinidad de CPU de un procesos en ejecución:

taskset -p mascara pid

Ejemplo:

taskset -p 0x00000001 34567

Si se dificulta el uso de máscaras de bit en hexadecimal, también es posible utilizar la opción -c y una lista numérica de CPUs lógicos, donde 0 corresponde al primer CPU, 1 corresponde al segundo CPU lógico, 2 corresponde al tercer CPU lógico y así sucesivamente.

taskset -c -p lista pid

Ejemplo:

taskset -c -p 1 34567

También es posible especificar varios CPU de manera simultánea, definiendo una lista de éstos separada por comas y que también permite definir rangos. Ejemplos:

taskset -c 0,1 tar Jcf modulos.tar.xz /lib
taskset -c -p 0,2 34567
taskset -c -p 4-7 34567

Al terminar los procedimientos, cierre la sesión de root.

Uso de top

Top es una herramienta que proporciona una visualización continua y en tiempo real de los procesos activos en un sistema, como una lista que de modo predeterminado lo hace de acuerdo al uso del CPU. Puede ordenar la lista por uso de memoria y tiempo de ejecución.

Captura de pantalla de top

Para ordenar la lista de procesos por orden de uso de memoria, pulse SHIFT+M. Para ordena la lista de procesos por orden de tiempo de ejecución, pulse SHIFT+T. Para invertir el orden de la lista, pulse SHIFT+R. Para activar o bien desactivar, la visualización por hilos, pulse SHIFT+H. Para ordenar de nuevo la lista de procesos por orden de uso de CPU, pulse SHIFT+P.

Para mostrar los procesos de un usuario en específico, pulse la tecla u y defina a continuación el nombre del usuario.

Para terminar o aniquilar cualquier proceso, pulse la tecla k y defina a continuación el número de identidad de proceso que corresponda y luego la señal a utilizar (9 o 15).

Para cambiar la prioridad de planificación de cualquier proceso, pulse la tecla r y a continuación defina el número de identidad de proceso que corresponda y luego el valor de prioridad de planificación deseado.

Pulse la tecla h para ver el la ayuda completa de top.