Conceptos Esenciales de Sysadmin
Archivos, permisos, procesos y servicios en servidores Linux que ejecutan APIs, workers y trabajos cron de Python: los comandos que los operadores usan antes de abrir un depurador de Python.
Receta
ls -la /var/log/myapp/
sudo systemctl status billing-api
sudo journalctl -u billing-api -n 100 --no-pager
df -h && du -sh /var/lib/myapp/*Cuándo usar esto:
- Iniciar sesión vía SSH en staging/producción para verificar el despliegue
- Errores de "Permiso denegado" en directorios de logs o de subida
- Alertas de disco lleno que bloquean escrituras
- El servicio no se inició después de un cambio de configuración
Ejemplo Práctico
# Nuevo directorio de despliegue propiedad del usuario del servicio
sudo mkdir -p /var/lib/billing-api/uploads
sudo chown billing:billing /var/lib/billing-api/uploads
sudo chmod 750 /var/lib/billing-api/uploads
# Comprobar la unidad y los logs recientes
sudo systemctl daemon-reload
sudo systemctl restart billing-api
sudo systemctl is-active billing-api
sudo journalctl -u billing-api -fLo que esto demuestra:
- Propiedad del directorio con mínimo privilegio para el usuario de la aplicación
- Ciclo de vida de
systemctldespués de un cambio en el archivo de unidad - Modo de seguimiento
-fen journal para triaje en vivo - Comprobación del disco antes de la rotación de logs grandes
Análisis Profundo
Cómo Funciona
- Usuarios/grupos - El proceso se ejecuta como usuario del servicio; los archivos necesitan propiedad coincidente.
- systemd - Los archivos de unidad definen
ExecStart, entorno, política de reinicio. - journald - Registro centralizado para servicios systemd.
- Sistema de archivos - Los inodos y los bloques pueden agotarse de forma independiente.
Mapa de Comandos
| Problema | Comandos |
|---|---|
| Permisos | ls -la, namei -l path, chmod, chown |
| Disco | df -h, du -xh --max-depth=1 |
| Servicio | systemctl status, restart, enable |
| Logs | journalctl -u, tail de /var/log/ |
Notas de Python
# Encontrar qué proceso está usando el puerto 8000
sudo ss -tlnp | grep 8000
# Confirmar la ruta de python del venv en la unidad systemd
systemctl cat billing-api | grep ExecStartErrores Comunes
- Ejecutar la aplicación como root - Desastre de seguridad. Solución: usuario dedicado, capacidades solo si se necesitan puertos bajos (preferir proxy inverso).
- chmod 777 uploads - Directorio de datos escribible por todos. Solución:
750y grupo de la aplicación. - Editar producción sin copia de seguridad - Archivo de unidad roto detiene el servicio. Solución: copiar la unidad a
/etc/systemd/system/con un comentario de versión. - Ignorar el agotamiento de inodos -
dfmuestra espacio pero las escrituras fallan. Solución:df -i. - Disco de logs lleno - La aplicación falla al escribir. Solución:
logrotate+ límites de tamaño de journal. - Denegaciones de SELinux/AppArmor - El permiso parece correcto pero aún así es EPERM. Solución:
ausearch/aa-status.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Docker logs | Servicios Python contenerizados | VMs systemd en metal desnudo |
| Kubernetes kubectl | Despliegues en K8s | Staging en VM única |
| Ansible playbooks | Configuración repetible de servidores | Depuración SSH puntual |
| Gestor de sesiones SSH en la nube | Sin claves SSH de bastión | On-premise aislado |
Preguntas Frecuentes
¿systemd o supervisord?
systemd en VMs Linux modernas; supervisord en contenedores heredados sin systemd.
¿Dónde poner .env en el servidor?
/etc/billing-api/env modo 600 propiedad root:billing con EnvironmentFile= en la unidad - no legible por todos.
¿Reiniciar vs recargar?
Recargar si la aplicación soporta HUP; las APIs de Python generalmente necesitan reiniciar después de un despliegue de código.
¿Comprobar umask para subidas?
La unidad de servicio puede establecer UMask=0027 para que los nuevos archivos no sean escribibles por grupo/todos.
¿tmpfs para subidas en /tmp?
tmpfs dimensionado evita el llenado del disco pero los datos se pierden al reiniciar - usar solo para scratch efímero.
¿Desfase horario NTP?
timedatectl status - JWT y correlación de logs fallan con reloj incorrecto.
¿ulimit archivos abiertos?
Aumentar LimitNOFILE= en la unidad para FastAPI con muchas conexiones detrás de keep-alive.
¿buscar binarios setuid?
Auditoría de seguridad find / -perm -4000 2>/dev/null - no relacionado con Python pero tarea común de sysadmin.
¿Subidas compartidas en NFS?
El mapeo de UID/GID debe coincidir entre nodos - preferir almacenamiento de objetos (S3) para subidas.
¿Sistema de archivos raíz de solo lectura?
Montar rutas escribibles explícitamente para logs y tmp - común en contenedores endurecidos.
Relacionado
- Gestión de Procesos y Recursos - señales y límites
- SSH y Trabajo Remoto - patrones de acceso
- Despliegue de FastAPI - diseño de producción
- Scripts Robustos - automatización defensiva
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.