Timers en systemd, reemplazo a cron
25/07/2017
Odiado por muchos, alabado por otros, systemd se ha impuesto como el init por excelencia del mundo Linux. Las distros más populares como Debian, Ubuntu, Fedora, openSUSE y Arch Linux usan systemd por defecto. Hoy vengo a hablaros de una característica interesante de systemd que son son los timers. Se trata de poder definir que arranquen programas/servicios cada cierto tiempo o a una hora, su versatilidad es tal que pueden sustituir a cron en la mayoría de casos. Veamos como usar los timers.
Para crear un timer primero necesitamos crear un servicio simple que ejecute el comando que queramos al ser iniciado.
Crea el archivo miapp.service y ponlo en /etc/systemd/system/.
Para el timer es necesario un archivo con extensión timer en /etc/systemd/system/. Se suele usar el mismo nombre que el que tiene el servicio para escenarios simples. El archivo miapp.timer quedaría así:
Aquí es donde podemos realizar toda la magia de los timers. Los timers de systemd tienen dos modos de funcionamiento. En el primer modo, systemd ejecutará el timer cada cierto tiempo desde el arranque del sistema ( o algo más tarde si no queremos saturar el sistema). El otro modo es el modo calendario donde podemos especificar fechas y horas con wildcards y patrones. Además, es posible modificar la hora exacta de ejecución del timer con las propiedades de Randomize y que evitan que si hay varios timers configurados a la vez, no lo hagan exactamente a la vez (pero siempre dentro de un margen). Otras opciones para OnCalendar pueden ser:
En ese caso, el timer se activaría los miércoles y domingos que cayesen entre el 10 y el 15 de todos los meses a las 12 horas.
Una vez estén copiados los archivos service y timer ejecutamos:
Ya solo queda esperar a que systemd lance el servicio en la fecha y hora especificados.
Los timers están integrados con systemd, por lo que los logs se registran con journalctl. Podemos inspeccionarlos de forma sencilla:
Para revisar los timers instalados y activos en el sistema puedes usar el comando:
Y ya estaría. De este modo podemos usar systemd como reemplazo de cron. Yo personalmente lo prefiero, ya que me parece una sintaxis más clara.
Creando un servicio
Para crear un timer primero necesitamos crear un servicio simple que ejecute el comando que queramos al ser iniciado.
Crea el archivo miapp.service y ponlo en /etc/systemd/system/.
[Unit]
Description=Cat Mania GIF
[Service]
ExecStart=/home/pi/charlatan/catmania.py
Creando el timer
Para el timer es necesario un archivo con extensión timer en /etc/systemd/system/. Se suele usar el mismo nombre que el que tiene el servicio para escenarios simples. El archivo miapp.timer quedaría así:
[Unit]
Description=Run Cat Mania daily
[Timer]
OnCalendar=daily
RandomizedDelaySec=5min
Unit=catmania.service
[Install]
WantedBy=timers.target
Aquí es donde podemos realizar toda la magia de los timers. Los timers de systemd tienen dos modos de funcionamiento. En el primer modo, systemd ejecutará el timer cada cierto tiempo desde el arranque del sistema ( o algo más tarde si no queremos saturar el sistema). El otro modo es el modo calendario donde podemos especificar fechas y horas con wildcards y patrones. Además, es posible modificar la hora exacta de ejecución del timer con las propiedades de Randomize y que evitan que si hay varios timers configurados a la vez, no lo hagan exactamente a la vez (pero siempre dentro de un margen). Otras opciones para OnCalendar pueden ser:
OnCalendar=Wed,Sun *-*-10..15 12:00:00
En ese caso, el timer se activaría los miércoles y domingos que cayesen entre el 10 y el 15 de todos los meses a las 12 horas.
Activando el timer
Una vez estén copiados los archivos service y timer ejecutamos:
systemctl start miapp.timer
systemctl enable miapp.timer
Ya solo queda esperar a que systemd lance el servicio en la fecha y hora especificados.
Monitorización
Los timers están integrados con systemd, por lo que los logs se registran con journalctl. Podemos inspeccionarlos de forma sencilla:
journalctl -f -u miapp.service
journalctl -f -u miapp.timer
Para revisar los timers instalados y activos en el sistema puedes usar el comando:
systemtctl list-timers
Y ya estaría. De este modo podemos usar systemd como reemplazo de cron. Yo personalmente lo prefiero, ya que me parece una sintaxis más clara.