Systemd: Unidades .service, .mount, .timer

Introducción

En systemd, todo lo que se puede gestionar se describe mediante unidades (units). Cada unidad es un archivo de texto con una extensión que indica su tipo. Los archivos de unidad del sistema se encuentran en /lib/systemd/system/ y las personalizaciones locales en /etc/systemd/system/ (tienen prioridad).

Unidad .service — Definir un servicio

Es el tipo de unidad más común. Define cómo se arranca, detiene y supervisa un proceso (demonio).

Estructura básica de un archivo .service:


[Unit]
Description=Mi servidor web personalizado
After=network.target

[Service]
Type=simple
User=www-data
ExecStart=/usr/local/bin/miservidor --port 8080
ExecStop=/usr/local/bin/miservidor --stop
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
          

Secciones principales:

  • [Unit] → descripción y dependencias (After, Requires, Wants)
  • [Service] → cómo ejecutar el servicio
  • [Install] → en qué target se activa al hacer enable

Opciones de Type:

  • simple → el proceso principal es el que se lanza con ExecStart
  • forking → el proceso hace fork al arrancar (clásico estilo daemon)
  • oneshot → se ejecuta una sola vez y termina
  • notify → el servicio avisa a systemd cuando está listo

Opción Restart:

  • no → no reiniciar nunca
  • on-failure → reiniciar solo si termina con error
  • always → reiniciar siempre que termine

Activar un servicio propio:


# cp miservidor.service /etc/systemd/system/
# systemctl daemon-reload
# systemctl enable --now miservidor
          

Unidad .mount — Puntos de montaje

Define puntos de montaje gestionados por systemd. El nombre del archivo debe coincidir con la ruta del punto de montaje, sustituyendo las / por -.

Ejemplo: /etc/systemd/system/mnt-datos.mount


[Unit]
Description=Disco de datos

[Mount]
What=/dev/sdb1
Where=/mnt/datos
Type=ext4
Options=defaults

[Install]
WantedBy=multi-user.target
          

En la práctica, la mayoría de los montajes se siguen configurando en /etc/fstab, y systemd genera unidades .mount automáticamente a partir de ese archivo.

Ver las unidades de montaje activas:


$ systemctl list-units --type=mount
          

Unidad .timer — Temporizadores

Permiten ejecutar unidades de forma programada, como alternativa moderna a cron. Cada .timer está vinculado a una unidad .service del mismo nombre base.

Ejemplo: ejecutar un script de backup cada día a las 2:00

Archivo /etc/systemd/system/backup.service:


[Unit]
Description=Script de backup diario

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
          

Archivo /etc/systemd/system/backup.timer:


[Unit]
Description=Backup diario a las 2:00

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target
          

Activar el timer:


# systemctl daemon-reload
# systemctl enable --now backup.timer
          

Opciones de temporización:

  • OnCalendar → horario absoluto (como cron: daily, weekly, Mon *-*-* 09:00)
  • OnBootSec → tiempo después del arranque (5min)
  • OnUnitActiveSec → tiempo desde la última ejecución (1h)
  • Persistent=true → ejecutar aunque se haya perdido la ejecución (sistema apagado)

Listar timers activos:


$ systemctl list-timers
          

Otros tipos de unidades

  • .socket → activa un servicio cuando llega tráfico en un socket (activación por socket)
  • .path → activa un servicio cuando cambia un archivo o directorio
  • .target → agrupa unidades (ya visto en el apartado anterior)
  • .slice → agrupa procesos para gestionar recursos (cgroups)
  • .scope → procesos externos iniciados fuera de systemd

Las unidades de systemd cubren todos los aspectos del ciclo de vida de un servicio, montaje o tarea programada.

Automatización de tareas: cron, at, systemd.timer

Índice de la sección

Índice del curso