
La aplicación no responde. El servidor va lento. Un proceso está consumiendo el 100% de la CPU. Saber cómo inspeccionar qué está ejecutándose en un sistema Linux, cómo terminarlo de forma limpia y cómo gestionar los servicios que arrancan automáticamente es imprescindible para cualquiera que trabaje con servidores.
Qué es un proceso
Un proceso es una instancia de un programa en ejecución. Cada proceso tiene un identificador único llamado PID (Process ID) y un PPID (Parent PID) que apunta al proceso que lo creó. El proceso con PID 1 es systemd (o init en sistemas más antiguos): el padre de todos los procesos del sistema.
Inspeccionar procesos

# Ver todos los procesos del sistema
ps aux
# Columnas: USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# STAT: R=running, S=sleeping, T=stopped, Z=zombie, D=uninterruptible sleep
# Filtrar por nombre
ps aux | grep nginx
ps aux | grep -v grep | grep nginx # excluir el propio grep
# Ver procesos en árbol (útil para ver padres e hijos)
ps axjf
pstree
# Monitor interactivo (actualización en tiempo real)
top
htop # versión más amigable (puede requerir instalación)
Enviar señales: kill y compañía
En Linux, la forma de comunicarse con un proceso es mediante señales. kill no solo «mata» procesos: envía una señal, que puede ser de terminación, pausa, recarga de configuración, etc.
# Ver las señales disponibles
kill -l
# Terminar un proceso limpiamente (le da tiempo de limpiar)
kill -15 1234 # SIGTERM (15) — la señal por defecto de kill
kill 1234 # equivalente
# Forzar la terminación inmediata (el proceso no puede ignorarla)
kill -9 1234 # SIGKILL (9)
# Matar por nombre
killall nginx # todos los procesos llamados nginx
pkill -f "server.js" # busca en el nombre completo del comando
# Recargar configuración sin reiniciar (nginx, sshd, etc.)
kill -HUP 1234 # SIGHUP (1)
La diferencia entre SIGTERM y SIGKILL es importante. SIGTERM pide al proceso que termine: el proceso puede interceptarla, guardar estado, cerrar conexiones y salir limpiamente. SIGKILL la envía directamente el kernel; el proceso no puede interceptarla ni ignorarla. Usa siempre SIGTERM primero y reserva SIGKILL para cuando el proceso no responde.
systemd: gestión de servicios

En las distribuciones modernas (Ubuntu, Debian, Fedora, RHEL), systemd es el sistema de init. Gestiona los servicios del sistema: los arranca al boot, los reinicia si fallan, gestiona sus dependencias.
# Estado de un servicio
systemctl status nginx
# Arrancar / parar / reiniciar
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
# Recargar configuración sin reiniciar (si el servicio lo soporta)
systemctl reload nginx
# Activar / desactivar al inicio del sistema
systemctl enable nginx
systemctl disable nginx
# Ver todos los servicios activos
systemctl list-units --type=service --state=running
journalctl: los logs de systemd
# Logs de un servicio en tiempo real
journalctl -u nginx -f
# Logs de las últimas 2 horas
journalctl -u nginx --since "2h ago"
# Solo errores, últimas 50 líneas
journalctl -p err -n 50
# Logs del arranque actual del sistema
journalctl -b
# Logs del arranque anterior (útil tras un crash)
journalctl -b -1
Con los procesos y servicios bajo control, el siguiente paso es entender cómo configurar el entorno en el que esos procesos se ejecutan: las variables de entorno que determinan dónde busca la aplicación su base de datos, qué puerto escuchar o qué nivel de logging activar.