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) htopinstalado (apt install htopodnf 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
| Columna | Significado |
|---|---|
| USER | Propietario del proceso |
| PID | ID del proceso |
| %CPU | Uso de CPU desde que inició el proceso |
| %MEM | Memoria residente como % de la RAM total |
| VSZ | Tamaño de memoria virtual (KB) |
| RSS | Tamaño del conjunto residente — RAM real usada (KB) |
| STAT | Estado del proceso (R=ejecutando, S=durmiendo, Z=zombie, T=detenido) |
| COMMAND | Lí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:
| Tecla | Acción |
|---|---|
P | Ordenar por uso de CPU |
M | Ordenar por uso de memoria |
T | Ordenar por tiempo acumulado de CPU |
k | Solicitar un PID para matar |
r | Reajustar la prioridad (renice) de un proceso |
1 | Alternar vista por núcleo de CPU |
u | Filtrar por nombre de usuario |
f | Abrir el administrador de campos (añadir/quitar columnas) |
q | Salir |
d | Cambiar el intervalo de actualización (segundos) |
H | Mostrar 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:
| Tecla | Acción |
|---|---|
F2 | Configuración (colores, columnas, medidores) |
F3 | Buscar en la lista de procesos |
F4 | Filtrar (mostrar solo procesos coincidentes) |
F5 | Vista en árbol (jerarquía de procesos) |
F6 | Selector de columna de ordenación |
F9 | Enviar señal al proceso seleccionado |
F10 | Salir |
| Teclas de flecha | Navegar por la lista de procesos |
Space | Marcar 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ística | ps | top | htop | pgrep/pkill |
|---|---|---|---|---|
| Actualización en vivo | No | Sí | Sí | No |
| Soporte de ratón | No | Limitado | Sí | No |
| Vista en árbol | Flag --forest | No | F5 | No |
| Enviar señales | No | Tecla k | F9 | Directamente |
| Filtrar/buscar | Pipe a grep | Tecla u | F4/F3 | Por patrón/regex |
| Salida en color | No | Básico | Rica | No |
| Amigable para scripts | Excelente | Deficiente | Deficiente | Excelente |
| Requiere instalación | Integrado | Integrado | Sí | Integrado |
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ñal | Número | Acción predeterminada | Caso de uso |
|---|---|---|---|
| SIGTERM | 15 | Terminación ordenada | Parada normal — permite limpieza |
| SIGKILL | 9 | Eliminación inmediata | El proceso ignora SIGTERM |
| SIGHUP | 1 | Recargar configuración | Indica a los demonios que relean la configuración |
| SIGSTOP | 19 | Pausar (no bloqueado) | Suspender un proceso |
| SIGCONT | 18 | Reanudar | Reanudar un proceso detenido |
| SIGUSR1/2 | 10/12 | Definido por el usuario | Especí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 auxproporciona una instantánea ordenada por CPU o memoria; usa--forestpara una vista en árbol.topyhtopproporcionan monitoreo en vivo;htopañ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/pgrepson alternativas amigables para scripts dekillcuando conoces un nombre en lugar de un PID.nice/reniceajustan la prioridad de planificación (-20 a 19); los valores negativos requieren root.bg/fg/jobsgestionan el control de trabajos del shell; usanohupotmuxpara sobrevivir al cierre de sesión./proc/<PID>/es la fuente de verdad —status,cmdline,fd/ymapsrevelan todo sobre un proceso en ejecución.