09 ene

Remplazar Cron jobs con Systemd.timers


cron-vs-systemdSystemd 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

  1. Podemos lanzar la tarea programada sin necesidad de esperar a que se auto lance.
  2. Cada tarea puede ser configurada para ser lanzada en un entorno especifico (systemd.exec)
  3. Cada tarea puede ser asignada a un cgroup
  4. Las tareas tendrán independencia gracias a que cada una será una unidad
  5. Podremos usar journalctl para comprobar la salida de cada tarea.

Contras

  1. Necesitamos crear dos unidades de systemd (timer y service) para programar una tarea.
  2. En caso de fallo no se envía el mail automáticamente, deberemos usar la opción OnFailure=

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>