systemd es el sistema de init y gestor de servicios estándar en la mayoría de distribuciones Linux modernas (Debian, Ubuntu, CentOS, Fedora, Arch). Reemplazó a SysVinit y ofrece arranque paralelo, dependencias entre unidades, journalización centralizada y control mediante systemctl.
¿Qué es systemd?
systemd gestiona unidades (units): servicios (.service), puntos de montaje (.mount), temporizadores (.timer), sockets (.socket), dispositivos (.device) y más. El comando principal para interactuar con él es systemctl.
Gestión de servicios con systemctl
Los comandos esenciales para administrar servicios son:
# Iniciar un servicio
sudo systemctl start nginx
# Detenerlo
sudo systemctl stop nginx
# Reiniciar
sudo systemctl restart nginx
# Recargar configuración sin interrumpir
sudo systemctl reload nginx
# Habilitar inicio automático
sudo systemctl enable nginx
# Deshabilitar auto-arranque
sudo systemctl disable nginx
# Ver estado
sudo systemctl status nginx
systemctl status muestra si el servicio está activo (running), la última línea de logs, el PID y el uso de memoria.
journalctl: Logs centralizados
journald recolecta todos los logs del sistema. Con journalctl se consultan:
# Ver todos los logs
journalctl
# Logs de un servicio específico
journalctl -u nginx
# En tiempo real (tail -f)
journalctl -f
# Desde una hora específica
journalctl --since "2026-06-09 10:00" --until "2026-06-09 12:00"
# Solo errores
journalctl -p err -u nginx
# Ver mensajes del kernel
journalctl -k
Crear un unit file personalizado
Los unit files se almacenan en /etc/systemd/system/. A continuación un ejemplo de un servicio que ejecuta un script Python:
[Unit]
Description=Mi Servicio Personalizado
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/mi-app
ExecStart=/usr/bin/python3 /opt/mi-app/main.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Tras crear el archivo: sudo systemctl daemon-reload, luego sudo systemctl enable mi-servicio y sudo systemctl start mi-servicio.
Timers: el cron de systemd
Los timers (.timer) reemplazan a cron. Disparan un servicio en intervalos o en momentos específicos:
sudo systemctl list-timers # Ver timers activos
systemctl status backup.timer # Estado de un timer
# Ejemplo de timer que ejecuta backup.service cada hora
cat /etc/systemd/system/backup.timer
[Unit]
Description=Ejecutar backup cada hora
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target
Troubleshooting: servicios fallidos
Cuando un servicio falla, lo primero es revisar:
systemctl --failed # Listar unidades fallidas
systemctl status # Ver último error
journalctl -xe -u # Log extendido
systemctl list-dependencies # Ver dependencias
# Habilitar debug en un servicio
systemctl edit # Añadir Environment=SYSTEMD_LOG_LEVEL=debug
Las dependencias rotas (After=, Requires=) son una causa común de fallos. systemctl list-dependencies permite trazarlas.