Systemd marcó un antes y un después en la gestión de servicios en Linux, dentro de las mil y una opciones que nos aporta también lo podemos usar como gestor de tareas programadas, con systemd.timer, al estilo del bien conocido cron
¿Cómo crear una tarea programada con systemd.timer?
El ejemplo que explicaré esta basado en la necesidad de que un servicio (syncthing) arranque después de un tiempo definido, desde el inicio del sistema, al ser un servicio bastante pesado buscamos que el sistema tenga una carga menor a la que suelen tener al arranque, normalmente alta.
Creación de las unidades systemd.timer y systemd.service
Crearemos un fichero syncthing.service
sudo vim /usr/lib/systemd/user/syncthing.service
[Unit] Description=Syncthing - Open Source Continuous File Synchronization Documentation=man:syncthing(1) Wants=syncthing-inotify.service [Service] Type=simple ExecStart=/usr/bin/syncthing -no-browser -no-restart -logflags=0 Restart=on-failure SuccessExitStatus=3 4 RestartForceExitStatus=3 4
En nuestro caso nos interesa que el servicio anterior arranque 10 minutos después de que el sistema haya arrancado, para ello usaremos systemd.timer.
Crearemos un fichero syncthing.timer ya que el nombre debe ser igual al servicio que hemos creado anteriormente. syncthing.service
sudo vim /usr/lib/systemd/user/syncthing.timer
[Unit] Description=Run syncthing 60 min after boot [Timer] OnBootSec=60min [Install] WantedBy=timers.target
Una vez creados, deberemos activarlo para el usuario que deseemos, únicamente la unidad timer.
systemctl enable --user syncthing.timer
Podremos comprobar la lista de tareas programadas usando el siguiente comando
[email protected] ~ $ systemctl --user list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Thu 2018-01-04 13:18:44 CET 42min left n/a n/a syncthing.timer syncthing.service 1 timers listed.
Ahí podemos ver que nuestra tarea y será ejecutada por primera vez en 42 minutos, en ese momento arrancara el servicio de syncthing
Si comprobamos el servicio.
[email protected] ~ $ systemctl status --user syncthing.timer _ syncthing.timer - Run syncthing 60 min after boot Loaded: loaded (/usr/lib/systemd/user/syncthing.timer; enabled; vendor preset: enabled) Active: active (waiting) since Thu 2018-01-04 12:33:59 CET; 1min 26s ago
Podemos ver que esta activa y a la espera de ser lanzada, con ello ya tendremos nuestra tarea programada con systemd en vez de cron.
Pros
- Podemos lanzar la tarea programada sin necesidad de esperar a que se auto lance.
- Cada tarea puede ser configurada para ser lanzada en un entorno especifico (systemd.exec)
- Cada tarea puede ser asignada a un cgroup
- Las tareas tendrán independencia gracias a que cada una será una unidad
- Podremos usar journalctl para comprobar la salida de cada tarea.
Contras
- Necesitamos crear dos unidades de systemd (timer y service) para programar una tarea.
- En caso de fallo no se envía el mail automáticamente, deberemos usar la opción OnFailure=