Conceptos Esenciales de Sysadmin
Comandos esenciales de Linux para gestionar servidores — procesos, servicios, disco, redes, usuarios y registros.
Receta
Tarjeta de receta de referencia rápida — lista para copiar y pegar.
# Información del sistema
uname -a # versión del kernel y arquitectura
hostnamectl # hostname, SO, kernel
uptime # cuánto tiempo lleva el servidor encendido
df -h # uso de disco (legible para humanos)
free -h # uso de memoria
top # monitor de procesos en vivo (q para salir)
# Gestión de procesos
ps aux # todos los procesos en ejecución
kill <PID> # detención elegante
kill -9 <PID> # forzar cierre
# Redes
ss -tulnp # puertos en escucha y sus procesos
curl -I https://example.com # solo encabezados HTTP
ip addr show # interfaces de red y direcciones IP
# Gestión de servicios (systemd)
sudo systemctl status nginx
sudo systemctl restart nginx
sudo systemctl enable nginx # iniciar al encenderCuándo usarlo: Al desplegar, depurar o mantener un servidor Linux — VPS, instancia EC2 o infraestructura autoalojada.
Ejemplo de Funcionamiento
# Diagnostica por qué está caída una aplicación Node.js
# 1. Verifica si el proceso está en ejecución
ps aux | grep node
# 2. Verifica el estado del servicio
sudo systemctl status my-app
# 3. Verifica en qué puerto debería estar
ss -tulnp | grep 3000
# 4. Verifica registros recientes
sudo journalctl -u my-app --since "10 minutes ago" --no-pager
# 5. Verifica espacio en disco (la aplicación puede haber llenado el disco)
df -h
# 6. Verifica memoria (el asesino OOM puede haberla detenido)
dmesg | tail -20Lo que esto demuestra:
- Depuración sistemática: proceso → servicio → puerto → registros → recursos
journalctles la forma estándar de leer registros de servicios systemddmesgmuestra mensajes del kernel, incluidas eliminaciones por falta de memoria
Análisis Profundo
Gestión de Procesos
# Listar todos los procesos con detalle completo
ps aux
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# node 1234 2.3 4.1 123456 78901 ? Ssl 08:00 1:23 node server.js
# Encontrar un proceso específico
ps aux | grep "next"
pgrep -f "next dev" # solo el PID
# Matar por nombre
pkill -f "next dev"
# Monitor de procesos en tiempo real (mejor que top)
htop # instalar: sudo apt install htop
# Ejecutar un proceso en segundo plano
node server.js &
# Traerlo de vuelta
fg
# Ejecutar un proceso que sobreviva desconexión SSH
nohup node server.js > app.log 2>&1 &
# O usa screen/tmux (recomendado)
tmux new -s myapp
# Desacoplar: Ctrl+B luego D
# Reacoplar: tmux attach -t myappDisco y Almacenamiento
# Uso de disco por directorio (ordenado, top 10)
du -sh /* 2>/dev/null | sort -rh | head -10
# Encontrar archivos grandes (>100MB)
find / -type f -size +100M 2>/dev/null
# Verifica uso de inodes (puede agotarse incluso con espacio libre)
df -i
# Monitorea E/S de disco
iostat -x 1 5 # 5 muestras, 1 segundo aparte
# Limpia caché de paquetes (Ubuntu/Debian)
sudo apt autoremove
sudo apt clean
# Verifica qué está usando espacio en el directorio actual
du -sh */ | sort -rhMemoria y CPU
# Descripción general de memoria
free -h
# total used free shared buff/cache available
# Mem: 16Gi 8.2Gi 1.3Gi 512Mi 6.5Gi 7.1Gi
# Principales consumidores de memoria
ps aux --sort=-%mem | head -10
# Principales consumidores de CPU
ps aux --sort=-%cpu | head -10
# Promedios de carga del sistema (1, 5, 15 minutos)
uptime
# 10:30:00 up 45 days, load average: 0.50, 0.75, 0.60
# Información de CPU
nproc # número de núcleos de CPU
lscpu # información detallada de CPURedes
# Todos los puertos en escucha
ss -tulnp
# -t TCP -u UDP -l escuchando -n numérico -p proceso
# Prueba conectividad
ping -c 3 google.com # 3 pings luego detente
traceroute example.com # traza la ruta de red
# Búsqueda de DNS
dig example.com
nslookup example.com
# Descargar un archivo
curl -O https://example.com/file.tar.gz
wget https://example.com/file.tar.gz
# Solicitud HTTP con encabezados y tiempo
curl -w "\nDNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" \
-o /dev/null -s https://example.com
# Firewall (Ubuntu con ufw)
sudo ufw status
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp
sudo ufw enableGestión de Servicios (systemd)
# Operaciones comunes de servicio
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx # recarga config sin tiempo de inactividad
sudo systemctl status nginx
# Habilitar/deshabilitar al encender
sudo systemctl enable nginx
sudo systemctl disable nginx
# Ver registros de un servicio
sudo journalctl -u nginx -f # seguir (cola en vivo)
sudo journalctl -u nginx --since today
sudo journalctl -u nginx -n 100 # últimas 100 líneas
# Crear un servicio personalizado para una aplicación Node.js
# /etc/systemd/system/my-app.service[Unit]
Description=My Node.js App
After=network.target
[Service]
Type=simple
User=deploy
WorkingDirectory=/opt/my-app
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
Environment=PORT=3000
[Install]
WantedBy=multi-user.target# Después de crear el archivo de servicio
sudo systemctl daemon-reload
sudo systemctl enable my-app
sudo systemctl start my-appUsuarios y Permisos
# Información del usuario actual
whoami
id
# Agregar un usuario
sudo adduser deploy
# Agregar usuario a un grupo
sudo usermod -aG sudo deploy # dar acceso sudo
sudo usermod -aG docker deploy # dar acceso Docker
# Permisos de archivo
chmod 755 script.sh # rwxr-xr-x
chmod 600 .env # rw------- (secretos)
chmod +x deploy.sh # agregar permiso de ejecución
# Cambiar propietario
sudo chown deploy:deploy /opt/my-app -R
# Referencia de permisos
# r=4 w=2 x=1
# 755 = owner(rwx) group(r-x) others(r-x)
# 644 = owner(rw-) group(r--) others(r--)
# 600 = owner(rw-) group(---) others(---)Registros
# Registros del sistema
sudo journalctl -xe # recientes con explicaciones
sudo journalctl --since "1 hour ago"
# Archivos de registro tradicionales
tail -f /var/log/syslog # seguir registro del sistema
tail -f /var/log/nginx/error.log # seguir errores nginx
less /var/log/auth.log # registro de autenticación
# Estado de rotación de registros
ls -la /var/log/nginx/
# Buscar registros
sudo journalctl -u my-app --grep="error" --since todayTrampas
Cosas que te pueden arruinar. Cada trampa incluye qué sale mal, por qué ocurre y la solución.
-
Kill -9 como primer recurso — Forzar el cierre de un proceso no le permite limpiar (cerrar archivos, liberar bloqueos). Solución: Intenta primero
kill <PID>(SIGTERM), espera unos segundos, luegokill -9solo si es necesario. -
Disco lleno pero no puedes encontrar archivos — Los archivos eliminados aún abiertos por un proceso consumen espacio hasta que se reinicia el proceso. Solución: Usa
lsof | grep deletedpara encontrarlos, luego reinicia el proceso que los sostiene. -
Desconexión SSH mata tu proceso — Los procesos en segundo plano iniciados en un shell mueren cuando termina la sesión SSH. Solución: Usa
tmux,screeno ejecuta el proceso como servicio systemd. -
Permiso denegado en puerto 80 — Los procesos sin root no pueden vincularse a puertos menores a 1024. Solución: Usa un proxy inverso (nginx/caddy) en puerto 80 que reenvíe a tu aplicación en 3000, o
sudo setcap cap_net_bind_service=+ep $(which node). -
ufw enablete bloquea — Habilitar el firewall sin permitir SSH primero. Solución: Siempre ejecutasudo ufw allow 22/tcpantes desudo ufw enable.
Alternativas
Otras formas de resolver el mismo problema — y cuándo es mejor cada una.
| Alternativa | Usar Cuándo | No Usar Cuando |
|---|---|---|
| Contenedores Docker | Entornos consistentes, fácil escalado | Servidores simples con una sola aplicación |
| PM2 | Gestión de procesos Node.js con clustering | Aplicaciones no-Node o cuando systemd es suficiente |
| Ansible/Terraform | Automatizar configuración de múltiples servidores | Tareas puntuales en un servidor |
| Plataformas gestionadas (Vercel, Railway) | Cero gestión de servidor deseada | Se necesita control completo sobre la infraestructura |
Preguntas Frecuentes
¿Cuál es la diferencia entre kill y kill -9?
kill <PID>envía SIGTERM, permitiendo que el proceso se limpie correctamentekill -9 <PID>envía SIGKILL, forzando terminación inmediata sin limpieza- Siempre intenta primero
kill; solo usa-9como último recurso
¿Cómo averiguo qué proceso está usando un puerto específico?
ss -tulnp | grep 3000
# o
lsof -i :3000¿Cómo creo un servicio systemd para una aplicación Node.js?
- Crea un archivo en
/etc/systemd/system/my-app.servicecon secciones[Unit],[Service]e[Install] - Establece
ExecStart=/usr/bin/node server.js,Restart=on-failure, yEnvironment=NODE_ENV=production - Ejecuta
sudo systemctl daemon-reload && sudo systemctl enable --now my-app
¿Cómo verifico por qué un servicio está fallando?
sudo systemctl status my-app
sudo journalctl -u my-app --since "10 minutes ago" --no-pagerstatusmuestra el estado actual y las últimas líneas de registrojournalctlproporciona el historial de registro completo para ese servicio
¿Qué significa la salida de free -h?
total= RAM física totalused= RAM actualmente en uso por procesosbuff/cache= RAM utilizada para caché de disco (recuperable)available= RAM que se puede usar sin intercambiar (libre + caché recuperable)
Trampa: Habilité ufw y me bloqueé el acceso SSH. ¿Cómo lo prevengo?
- Siempre ejecuta
sudo ufw allow 22/tcpantes desudo ufw enable - Si estás bloqueado, necesitas acceso a la consola (p. ej., consola web del proveedor de nube) para deshabilitar el firewall
¿Cómo encuentro qué está consumiendo todo el espacio en disco?
du -sh /* 2>/dev/null | sort -rh | head -10- También verifica archivos eliminados abiertos por procesos:
lsof | grep deleted
¿Cómo mantengo un proceso en ejecución después de desconectarme de SSH?
- Usa
tmuxoscreenpara crear una sesión persistente - O ejecuta el proceso como servicio systemd
nohup node server.js > app.log 2>&1 &funciona como solución rápida
Trampa: ¿Por qué se elimina mi aplicación Node.js aleatoriamente en el servidor?
- El asesino OOM (Out Of Memory) de Linux termina procesos cuando la memoria se agota
- Verifica con
dmesg | grep -i oom - Soluciona aumentando la RAM del servidor, configurando
--max-old-space-sizeo arreglando fugas de memoria
¿Cómo doy a un usuario acceso sudo?
sudo usermod -aG sudo deploy- El usuario debe cerrar sesión e iniciar sesión nuevamente para que el cambio de grupo surta efecto
¿Qué significan los números de permisos de archivo de Linux como 755 y 600?
- Cada dígito representa propietario, grupo, otros; los valores son r=4, w=2, x=1
755= propietario rwx, grupo r-x, otros r-x (ejecutables, scripts)600= propietario rw-, grupo ---, otros --- (secretos como.env)644= propietario rw-, grupo r--, otros r-- (archivos regulares)
En un despliegue de TypeScript, ¿cómo verifico que la salida de compilación es correcta en el servidor?
- Verifica que el directorio de compilación exista:
ls -la /opt/my-app/.next/ - Verifica que
node_modulesesté instalado:ls /opt/my-app/node_modules/.package-lock.json - Prueba el comando de inicio manualmente:
cd /opt/my-app && NODE_ENV=production node server.js
Relacionado
- Búsqueda y Regex — Encuentra archivos, busca contenido y usa patrones regex
- Comandos de Desarrollador Node.js — npm, ambiente y comandos de compilación
- Productividad en Shell — Tuberías, redirección, scripting y consejos de flujo de trabajo