Esta guía incluye una plantilla comentada para definir servicios con
systemd
. Todas las opciones están desactivadas por defecto (comentadas) salvo las básicas, y perfectamente alineadas para facilitar la edición.
📁 Ubicación recomendada: /etc/systemd/system/mi_servicio.service
[Unit]
Description=Mi Servicio Personalizado
After=network.target
# Wants=network-online.target # Intenta que otros servicios estén activos antes
# Requires=network.target # Este servicio depende críticamente de otro
# StartLimitIntervalSec=500 # Ventana de tiempo para contar fallos de arranque
# StartLimitBurst=5 # Máximo intentos de arranque en esa ventana
[Service]
ExecStart=/usr/local/bin/mi_servicio.sh
# ExecStop=/usr/local/bin/mi_servicio_stop.sh # Comando a ejecutar para detener el servicio
Restart=always # Reinicia siempre si falla o se detiene
# RestartSec=3 # Espera X segundos antes de reiniciar
# StartLimitInterval=60 # Intervalo para contar reinicios (reintentos)
# StartLimitBurst=3 # Máximo reintentos en ese intervalo
# User=nobody # Usuario bajo el cual correrá el servicio
# Group=nogroup # Grupo del servicio
# ProtectSystem=full # Monta el sistema en solo lectura para el servicio
# ProtectHome=true # Bloquea acceso a /home
# PrivateTmp=true # Usa un /tmp exclusivo y privado
# NoNewPrivileges=true # No permite ganar privilegios tras arrancar
# CapabilityBoundingSet= # Lista blanca de capacidades permitidas
# TimeoutStartSec=30 # Tiempo máximo para que el servicio arranque
# TimeoutStopSec=10 # Tiempo máximo para que se detenga con gracia
# RuntimeMaxSec=3600 # Tiempo máximo total de ejecución
# Restart=on-failure # Solo reinicia si el proceso falla
# SuccessExitStatus=0 # Define qué códigos de salida se consideran éxito
# FailureAction=none # Acción a tomar si falla (reboot, halt, etc.)
# LimitNOFILE=65536 # Límite de archivos abiertos
# LimitNPROC=4096 # Límite de procesos simultáneos
# MemoryMax=100M # Límite de memoria RAM
# CPUQuota=50% # Límite de CPU asignada al servicio
# StandardOutput=journal # Salida estándar al journal (log)
# StandardError=journal # Error estándar al journal (log)
# SyslogIdentifier=mi_servicio # Nombre identificador en los logs del sistema
[Install]
WantedBy=multi-user.target
Define relaciones con otros servicios o condiciones de inicio.
Opción | Descripción |
---|---|
Wants |
Servicios deseados pero no obligatorios |
Requires |
Servicios obligatorios, si fallan este también |
After |
Define el orden de inicio |
StartLimit* |
Controla cuántos intentos antes de marcar fallo |
Configura cómo se ejecuta, detiene y aísla el servicio.
Opción | Descripción |
---|---|
ExecStart |
Comando principal del servicio |
ExecStop |
Comando que se ejecuta al detener el servicio |
Restart |
Política de reinicio (always, on-failure…) |
User / Group |
Seguridad: usuario y grupo sin privilegios |
Timeout* |
Límites de tiempo de arranque/parada/ejecución |
MemoryMax , CPUQuota |
Límite de recursos |
Protect* |
Sandbox y seguridad |
StandardOutput |
Redirección de logs |
SyslogIdentifier |
Cómo aparece en los logs |
Define cuándo o cómo se activa el servicio.
Opción | Descripción |
---|---|
WantedBy |
En qué "target" debe iniciarse (multi-user.target = arranque normal sin GUI) |
# Crear y recargar el servicio
sudo systemctl daemon-reload
# Activar al arranque
sudo systemctl enable mi_servicio
# Iniciar / detener / reiniciar
sudo systemctl start mi_servicio
sudo systemctl stop mi_servicio
sudo systemctl restart mi_servicio
# Ver estado
sudo systemctl status mi_servicio
# Ver logs
journalctl -u mi_servicio -f