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.