Programar una tarea en linux con systemd

Programar una tarea en linux con systemd

Una de las cosas que me extrañó al empezar a usar Arch linux fue que no tenia el crontab que viene instalado en la mayoría de distribuciones que había utilizado hasta el momento. Busque un poco por Internet y la conclusión fue: instalar una alternativa a crontab o hacerlo mediante systemd. Como no me gusta instalar paquetes prescindibles, lo hice con systemd. Aquí va un ejemplo donde vamos a programar el refresco de los repositorios de pacman que generé en la anterior entrada.

Vamos a dividir el proceso en tres partes, crear el script que refresca la lista de repositorios, crear el servicio que llama a ese script y crear timer que llama al servicio.

Creacion del script

Esta parte es muy sencilla, vamos a crear un script que usa el ejecutable rankmirrors que vimos en el articulo anterior, para ordenar los 6 mejores mirrors del listado de los cercanos y los guarda en el mirrorlist de pacman. El fichero se guarda en /usr/local/bin, con permisos de ejecucion y usuario root

#!/bin/bash 

cd /etc/pacman.d 
rankmirrors -n 6 mirrorlist.near > mirrorlist 

Creacion del servicio

Ahora vamos con el servicio. Vamos a crear un fichero de configuración .service que va a enlazar con el script anterior. Este servicio se comportará como cualquier otro servicio que manejamos normalmente (apache, httpd, NetworkManager, sddm,…). Los servicios los podemos guardar en varios sitios. Si van a ser exclusivos del usuario, se guardarían en ~/.config/systemd/user/ y si son para todo el equipo en /etc/systemd/system. En nuestro caso es la segunda opcion, ya que toca ficheros de configuración con permisos de root. Vamos con el contenido del fichero:

[Unit]
Description=Update pacman mirrorlist
After=network.target
 
[Service]
ExecStart=/usr/local/bin/update-pacman-mirrors
 
[Install]
WantedBy=multi-user.target

En la seccion Unit, metemos una descripción del serivicio. El campo After no es obligatorio, pero lo he puesto para que se ejecute cuando la red este disponible. En Service pondremos el archivo a ejecutar y por ultimo en la seccion Install, el campo obligatorio es el WantedBy, que es el target de nuestro servicio, en este caso, multi-user.target significa que el sistema operativo en esta un modo en el que ya puede funcionar con varios usuarios y la consola. El siguiente seria el graphical.target, que es el que se usa por defecto.

En este momento ya tenemos un servicio creado. Para probarlo podemos arrancarlo como haríamos con cualquier otro

$ sudo systemctl start update-pacman-mirrors.service #para servicios del sistema
$ systemctl --user start update-pacman-mirrors.service #para servicios de usuario

Si queremos ver el log del servicio

$ journalctl -f -u update-pacman-mirrors.service #log del servicio a nivel de sistema
$ journalctl --user -f -u update-pacman-mirrors.service #log del servicio a nivel usuario

Otra cosa a tener en cuenta ahora es que si necesitamos hacer algún cambio al código del servicio, debemos refrescar para que tenga en cuenta los cambios:

$ sudo systemctl daemon-reload
$ systemctl --user daemon-reload

Creacion del timer

Por último vamos a crear el fichero .timer. Su función es establecer cuando se va a ejecutar nuestro servicio. Lo pondremos en el mismo directorio que el servicio, con el mismo nombre y extension .timer.

[Unit]
Description=Update pacman mirrorlist every 10 minutes
 
[Timer]
#OnCalendar=*:0/10
OnBootSec=5min
#OnCalendar=0/4:00:00
 
[Install]
WantedBy=timers.target

La estructura es similar a la del servicio. En el la sección Timer, ponemos cuando hay que ejecutarlo. En el ejemplo os pongo 3 opciones. Cada 10 minutos, a los 5 minutos de arrancar y cada 4 horas. Se podrían llegar a combinar, haciendo que se ejecute a los 5 minutos de arrancar y luego cada 4 horas por ejemplo. La nomenclatura no es la misma que en crontab, pero se parece.

Para dejar la tarea programada para siempre, arrancamos el timer y lo habilitamos al inicio

$ sudo systemctl start update-pacman-mirrors.timer
$ sudo systemctl enable update-pacman-mirrors.timer

Y para comprobar que hemos configurado todo bien, podemos listar los timers que tenemos activos con información de cuando se han ejecutado y cuando será la siguiente ejecución.

$ systemctl list-timers

Si queréis mas información sobre systemd, servicios, timers y demás, de aquí he sacado yo todo lo de este articulo.

https://wiki.archlinux.org/index.php/Systemd

https://wiki.archlinux.org/index.php/Systemd/User

https://wiki.archlinux.org/index.php/Systemd/Timers

https://jlk.fjfi.cvut.cz/arch/manpages/man/systemd.timer.5

https://jlk.fjfi.cvut.cz/arch/manpages/man/systemd.time.7

 

Deja una respuesta