La gestión de procesos en Linux es una habilidad fundamental de administración de sistemas — ya sea que estés rastreando un proceso que consume toda la CPU, deteniendo con gracia un demonio problemático, o ajustando la prioridad de planificación para un trabajo por lotes, saber cómo inspeccionar y controlar procesos mantiene los sistemas saludables. Esta guía cubre el conjunto completo de herramientas: ps aux, top, htop, señales kill, nice/renice, trabajos en segundo plano y el sistema de archivos /proc, con ejemplos prácticos que puedes usar de inmediato.

Requisitos Previos

  • Un sistema Linux (cualquier distribución — Ubuntu, Debian, RHEL, Fedora, Arch)
  • Acceso a la terminal con una cuenta de usuario normal (algunos comandos requieren sudo)
  • htop instalado (apt install htop o dnf install htop) para la sección de htop
  • Familiaridad básica con la línea de comandos

Listar Procesos con ps

ps (estado del proceso) es la herramienta clásica de instantáneas. Lee /proc e imprime el estado actual del proceso en el momento en que lo ejecutas — a diferencia de top, no se actualiza automáticamente.

ps aux — sintaxis BSD

ps aux
ColumnaSignificado
USERPropietario del proceso
PIDID del proceso
%CPUUso de CPU desde que inició el proceso
%MEMMemoria residente como % de la RAM total
VSZTamaño de memoria virtual (KB)
RSSTamaño del conjunto residente — RAM real usada (KB)
STATEstado del proceso (R=ejecutando, S=durmiendo, Z=zombie, T=detenido)
COMMANDLínea de comando completa

Ordenar por CPU y mostrar los peores infractores:

ps aux --sort=-%cpu | head -20
ps aux --sort=-%mem | head -20

Encontrar procesos por nombre sin que grep aparezca en los resultados:

ps aux | grep '[n]ginx'

ps -ef — sintaxis UNIX

ps -ef

ps -ef añade la columna PPID (PID padre), que es invaluable cuando se rastrean árboles de procesos. Usa -eH o --forest para una vista en árbol:

ps -eH
ps -ef --forest

Estados de proceso decodificados

  • R — ejecutable (en CPU o en la cola de ejecución)
  • S — suspensión interrumpible (esperando E/S o un evento)
  • D — suspensión no interrumpible (generalmente E/S de disco — no se puede matar)
  • Z — zombie (terminado pero el padre no lo ha recogido)
  • T — detenido (Ctrl+Z o SIGSTOP)

Un alto número de procesos en estado D indica saturación de E/S. Los zombies Z son inofensivos en pequeña cantidad pero indican que un padre no llama a wait().

Monitoreo Interactivo con top

top proporciona una vista en vivo con actualización automática (intervalo predeterminado de 3 segundos). Lánzalo y usa estos atajos de teclado:

TeclaAcción
POrdenar por uso de CPU
MOrdenar por uso de memoria
TOrdenar por tiempo acumulado de CPU
kSolicitar un PID para matar
rReajustar la prioridad (renice) de un proceso
1Alternar vista por núcleo de CPU
uFiltrar por nombre de usuario
fAbrir el administrador de campos (añadir/quitar columnas)
qSalir
dCambiar el intervalo de actualización (segundos)
HMostrar hilos individuales en lugar de procesos

El encabezado resume los promedios de carga (1, 5, 15 minutos), el desglose de CPU (us/sy/id/wa) y la memoria. Un valor wa (espera de E/S) superior al 10-15% generalmente indica un cuello de botella de almacenamiento.

Ejecuta top de forma no interactiva para capturar una instantánea:

top -bn1 | head -30

Monitoreo de Procesos Más Rico con htop

htop es top con una interfaz de usuario a color, soporte de ratón y controles más intuitivos. Después de instalarlo y ejecutarlo, la barra de teclas de función en la parte inferior te guía:

TeclaAcción
F2Configuración (colores, columnas, medidores)
F3Buscar en la lista de procesos
F4Filtrar (mostrar solo procesos coincidentes)
F5Vista en árbol (jerarquía de procesos)
F6Selector de columna de ordenación
F9Enviar señal al proceso seleccionado
F10Salir
Teclas de flechaNavegar por la lista de procesos
SpaceMarcar un proceso para acción masiva

htop muestra barras de CPU por núcleo, barras de memoria e intercambio, y te permite desplazarte horizontalmente para ver líneas de comando largas — todo lo que top requiere pulsaciones adicionales para mostrar.

Comparación de Herramientas de Gestión de Procesos

Característicapstophtoppgrep/pkill
Actualización en vivoNoNo
Soporte de ratónNoLimitadoNo
Vista en árbolFlag --forestNoF5No
Enviar señalesNoTecla kF9Directamente
Filtrar/buscarPipe a grepTecla uF4/F3Por patrón/regex
Salida en colorNoBásicoRicaNo
Amigable para scriptsExcelenteDeficienteDeficienteExcelente
Requiere instalaciónIntegradoIntegradoIntegrado

Usa ps y pgrep/pkill en scripts; usa top o htop de forma interactiva en servidores.

Enviar Señales: kill, pkill, killall

Las señales son el mecanismo principal de IPC para el control de procesos. Las más importantes:

SeñalNúmeroAcción predeterminadaCaso de uso
SIGTERM15Terminación ordenadaParada normal — permite limpieza
SIGKILL9Eliminación inmediataEl proceso ignora SIGTERM
SIGHUP1Recargar configuraciónIndica a los demonios que relean la configuración
SIGSTOP19Pausar (no bloqueado)Suspender un proceso
SIGCONT18ReanudarReanudar un proceso detenido
SIGUSR1/210/12Definido por el usuarioEspecífico de la aplicación (por ejemplo, rotación de logs)

kill por PID

kill 1234          # SIGTERM — pedir amablemente
kill -15 1234      # SIGTERM explícito
kill -9 1234       # SIGKILL — sin piedad
kill -HUP 1234     # recargar configuración
kill -l            # listar todos los nombres de señales

Siempre intenta SIGTERM primero. Dale al proceso 10-30 segundos, luego escala a SIGKILL si es necesario.

pkill y pgrep — coincidir por nombre o patrón

pgrep nginx                # listar PIDs que coincidan con "nginx"
pgrep -u www-data nginx    # reducir a un usuario específico
pkill nginx                # SIGTERM a todos los procesos coincidentes
pkill -9 nginx             # SIGKILL a todos los coincidentes
pkill -HUP nginx           # recargar configuración de nginx (igual que kill -HUP $(pgrep nginx))

killall — matar todas las instancias por nombre exacto

killall firefox
killall -9 java
killall -u jcarlos          # matar todos los procesos de un usuario

pkill acepta regex y coincidencias parciales; killall requiere el nombre exacto del proceso. Prefiere pkill en scripts.

Ajuste de Prioridad con nice y renice

Linux planifica los procesos usando un valor de amabilidad de -20 (mayor prioridad, menos amable con los demás) a 19 (menor prioridad). El valor predeterminado es 0. Solo root puede establecer valores negativos.

nice — establecer prioridad al lanzar

nice -n 19 tar -czf backup.tar.gz /var/data   # copia de seguridad en segundo plano, baja prioridad
nice -n -5 ./realtime-processor                # mayor prioridad (requiere sudo)
sudo nice -n -10 ./critical-task

renice — ajustar un proceso en ejecución

renice -n 10 -p 1234         # bajar la prioridad del PID 1234
sudo renice -n -5 -p 1234    # subir prioridad (requiere root)
renice -n 15 -u jcarlos      # bajar prioridad para todos los procesos del usuario

Verificar la amabilidad actual con ps:

ps -o pid,ni,comm -p 1234

Trabajos en Segundo Plano: bg, fg y jobs

El control de trabajos del shell te permite gestionar múltiples tareas sin abrir terminales adicionales.

long-running-command &        # iniciar directamente en segundo plano
./script.sh                   # ejecutando en primer plano
# pulsa Ctrl+Z para suspender
[1]+  Stopped    ./script.sh

jobs                          # listar trabajos
# [1]+  Stopped    ./script.sh
# [2]-  Running    long-running-command &

bg %1                         # reanudar trabajo 1 en segundo plano
fg %1                         # traer trabajo 1 al primer plano
fg %2                         # traer trabajo 2 al primer plano

disown %1                     # desconectar trabajo del shell (sobrevive al cierre de sesión)
nohup ./script.sh &           # inmune a SIGHUP, salida a nohup.out

& y bg aún vinculan el proceso a la sesión de terminal. Usa nohup, screen o tmux para trabajos que deben sobrevivir al cierre de sesión.

Explorar /proc

Todo lo que ps y top saben proviene del sistema de archivos virtual /proc — una ventana en vivo a la tabla de procesos del kernel.

ls /proc/1234/           # todos los archivos para el PID 1234
cat /proc/1234/status    # estado legible por humanos (Name, State, VmRSS, Threads…)
cat /proc/1234/cmdline   # línea de comando completa (separada por nulos)
cat /proc/1234/environ   # variables de entorno al lanzar
ls -l /proc/1234/fd/     # descriptores de archivo abiertos (sockets, tuberías, archivos)
cat /proc/1234/maps      # mapa de memoria
cat /proc/self/status    # info sobre el proceso shell actual

Archivos /proc útiles a nivel de sistema:

cat /proc/loadavg        # carga 1m, 5m, 15m + procesos en ejecución/totales
cat /proc/meminfo        # estadísticas detalladas de memoria
cat /proc/cpuinfo        # detalles de CPU por núcleo
cat /proc/uptime         # tiempo de actividad del sistema en segundos

Escenario Real: Pico de CPU en Servidor de Producción

Tienes un servidor web de producción que de repente alcanza el 100% de CPU. Aquí está el procedimiento:

# 1. Identificar al culpable
ps aux --sort=-%cpu | head -10

# 2. Obtener más detalles (archivos abiertos, conexiones de red)
PID=<pid del proceso problemático>
ls -l /proc/$PID/fd | wc -l     # cantidad de descriptores de archivo
cat /proc/$PID/status            # verificar hilos, memoria
cat /proc/$PID/cmdline           # comando exacto

# 3. Intentar una parada ordenada primero
kill -15 $PID
sleep 15

# 4. Verificar si se detuvo
ps -p $PID

# 5. Forzar la eliminación si aún está en ejecución
kill -9 $PID

# 6. Si es un servicio, reiniciar limpiamente
sudo systemctl restart myapp

Si el proceso es un demonio conocido, kill -HUP puede ser todo lo que necesitas para limpiar un estado bloqueado sin un reinicio completo.

Errores Comunes y Casos Especiales

SIGKILL no puede ser capturado ni ignorado. Un proceso en suspensión no interrumpible (estado D, esperando E/S) no responderá a SIGKILL hasta que la E/S se complete. En este caso, el dispositivo subyacente o el montaje NFS suele ser el problema.

Los procesos zombie no son una fuga. Un zombie (estado Z) retiene un PID pero no tiene recursos. Desaparece cuando el padre llama a wait(). Si los zombies se acumulan, el proceso padre tiene un error — matar al padre o corregirlo es la solución, no matar al zombie directamente.

El %CPU de ps es el promedio de por vida, no el actual. El %CPU en ps aux se calcula sobre la vida útil del proceso. Un proceso que tuvo un pico ayer y ahora está inactivo muestra un número bajo. Usa top o htop para CPU en tiempo real.

nice requiere root para valores negativos. Los usuarios normales solo pueden aumentar la amabilidad (bajar la prioridad). Escribir mal nice -10 (que bash interpreta como el flag -1 0) es un error común — siempre usa nice -n 10.

pkill coincide con subcadenas. pkill python matará python3, python2 y cualquier proceso con “python” en su nombre — incluyendo tu editor si integra un intérprete Python. Usa pgrep primero para verificar qué se va a coincidir.

El control de trabajos es por shell. jobs solo muestra los trabajos iniciados en la sesión de shell actual. Usa ps aux | grep comando para encontrar procesos desconectados.

Solución de Problemas

“Operación no permitida” al matar un proceso — estás intentando matar un proceso de otro usuario o un proceso root. Usa sudo kill PID.

El proceso se reinicia inmediatamente después de matarlo — un supervisor (systemd, supervisord, Docker) lo está reiniciando. Detén el servicio con sudo systemctl stop nombre-servicio en su lugar.

kill -9 no funciona — el proceso está en estado D (suspensión no interrumpible). Verifica iostat -x 1 para la espera de E/S; el dispositivo de bloque o el sistema de archivos de red está bloqueado. En casos extremos puede ser necesario reiniciar.

htop muestra el uso de swap en aumento — el sistema tiene presión de memoria. Usa ps aux --sort=-%mem | head -10 para encontrar los mayores consumidores y considera añadir swap o reiniciar la aplicación problemática.

Promedio de carga alto pero uso de CPU bajo — los procesos están esperando E/S, no CPU. Verifica iostat, iotop y los conteos en estado D con ps aux | awk '$8 ~ /D/ {print}'.

Resumen

  • ps aux proporciona una instantánea ordenada por CPU o memoria; usa --forest para una vista en árbol.
  • top y htop proporcionan monitoreo en vivo; htop añade color, soporte de ratón y atajos de teclas de función.
  • Señales: siempre intenta SIGTERM (15) primero, escala a SIGKILL (9) solo si es necesario; SIGHUP (1) recarga la mayoría de los demonios.
  • pkill / pgrep son alternativas amigables para scripts de kill cuando conoces un nombre en lugar de un PID.
  • nice / renice ajustan la prioridad de planificación (-20 a 19); los valores negativos requieren root.
  • bg / fg / jobs gestionan el control de trabajos del shell; usa nohup o tmux para sobrevivir al cierre de sesión.
  • /proc/<PID>/ es la fuente de verdad — status, cmdline, fd/ y maps revelan todo sobre un proceso en ejecución.

Artículos Relacionados