Como crear tareas usando Systemd Timers

Hola a todos!!!

En esta ocasión empezamos con una primera versión de como configurar tareas usando Systemd Timers. Systemd es el sistema de inicio predeterminado en muchas distribuciones de Linux modernas. Junto con systemd, se puede usar su función de temporizador (timers) para programar y monitorear tareas en el sistema. Systemd Timers tiene una sintaxis similar a la de crontab, y también ofrece herramientas para monitorear el estado de las tareas. Lo que haremos aquí es programar una herramienta que nos permita configurar fácilmente una tarea utilizando los siguientes parámetros:

-s (ruta de ubicación del programa o script a ejecutar)

-t (intervalo de tiempo en segundos) por ejemplo 60sec, 120sec, etc.

-u (usuario que ejecuta la tarea)

-p (descripción de la tarea) generalmente es el nombre del programa o script que lo identifica sin espacio en blanco

-n (nombre del temporizador) de igual forma podría ser el nombre del programa o script sin espacio en blanco

A continuación el script que utilizaremos:

vi st.sh

#!/bin/bash

# Aceptar los parámetros
while getopts s:t:u:p:n: option
do
case "${option}"
in
s) SCRIPT_PATH=${OPTARG};;
t) TIMER_INTERVAL=${OPTARG};;
u) TIMER_USER=${OPTARG};;
p) TIMER_DESCRIPTION=${OPTARG};;
n) TIMER_NAME=${OPTARG};;
esac
done

# Comprobar si se han proporcionado todos los parámetros necesarios
if [[ -z "$SCRIPT_PATH" || -z "$TIMER_INTERVAL" || -z "$TIMER_USER" || -z "$TIMER_DESCRIPTION" || -z "$TIMER_NAME" ]]; then
    echo "Error: Faltan argumentos."
    echo "Uso: $0 -s /ruta/al/script -t 'intervalo de tiempo' -u usuario -p 'descripción' -n 'nombre del temporizador'"
    exit 1
fi

# Crear archivo de servicio
cat > /etc/systemd/system/$TIMER_NAME.service <<EOF
[Unit]
Description=$TIMER_DESCRIPTION

[Service]
User=$TIMER_USER
ExecStart=$SCRIPT_PATH

[Install]
WantedBy=multi-user.target
EOF

# Crear archivo de temporizador
cat > /etc/systemd/system/$TIMER_NAME.timer <<EOF
[Unit]
Description=$TIMER_DESCRIPTION

[Timer]
OnUnitActiveSec=$TIMER_INTERVAL
Unit=$TIMER_NAME.service

[Install]
WantedBy=timers.target
EOF

# Habilitar temporizador y servicio
systemctl enable $TIMER_NAME.timer
systemctl start $TIMER_NAME.timer

echo "La tarea se ha programado correctamente."

A continuación creamos la tarea a ejecutar, que será un script básico en bash.

vi task1.sh

#!/bin/bash

therandom=$(uuidgen)

echo "Ejecutamos esta tarea con el ID: $therandom"

 Seguidamente le damos permisos de ejecución:

chmod +x /root/task1.sh

 Y por último generamos la tarea en Sytemd Timers llamando a nuestra herramienta de creación de esta forma:

./st.sh -s /root/task1.sh -t '120sec' -u root -p 'task1' -n 'task1'

Created symlink /etc/systemd/system/timers.target.wants/task1.timer → /etc/systemd/system/task1.timer.
La tarea se ha programado correctamente.

 Ya está creada la tarea es el momento de activarla.

systemctl daemon-reload

systemctl enable task1

Created symlink /etc/systemd/system/multi-user.target.wants/task1.service → /etc/systemd/system/task1.service.

systemctl start task1

systemctl start task1.timer

Con esto hemos habilitado el servicio task1 y luego hemos dado inicio al temporizador timer.

Ahora vamos va revisar el stado del servicio y el timer.

systemctl status task1

● task1.service - task1
   Loaded: loaded (/etc/systemd/system/task1.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Sun 2023-03-19 19:56:25 PDT; 2s ago
  Process: 2261 ExecStart=/root/task1.sh (code=exited, status=0/SUCCESS)
 Main PID: 2261 (code=exited, status=0/SUCCESS)

Mar 19 19:56:25 localhost.localdomain systemd[1]: Started task1.
Mar 19 19:56:25 localhost.localdomain task1.sh[2261]: Ejecutamos esta tarea con el ID: 0b1c3027-dacb-4ef3-a2b0-21bdfe57d4e5
Mar 19 19:56:25 localhost.localdomain systemd[1]: task1.service: Succeeded.

 

systemctl status task1.timer

● task1.timer - task1
   Loaded: loaded (/etc/systemd/system/task1.timer; enabled; vendor preset: disabled)
   Active: active (waiting) since Sun 2023-03-19 19:52:15 PDT; 5min ago
  Trigger: Sun 2023-03-19 19:58:25 PDT; 44s left

Mar 19 19:52:15 localhost.localdomain systemd[1]: Started task1.

 Hasta aquí ya hemos programado nuestra tarea task1 usando Systemd Timers. Para ver las configuraciones puedes listar en la siguiente ruta:

ls -l /etc/systemd/system

drwxr-xr-x. 2 root root   31 Jul 31  2021 basic.target.wants
drwxr-xr-x. 2 root root  119 Feb 23 07:42 cloud-init.target.wants
lrwxrwxrwx. 1 root root   41 Jul 31  2021 dbus-org.fedoraproject.FirewallD1.service -> /usr/lib/systemd/system/firewalld.service
lrwxrwxrwx. 1 root root   57 Jul 31  2021 dbus-org.freedesktop.nm-dispatcher.service -> /usr/lib/systemd/system/NetworkManager-dispatcher.service
lrwxrwxrwx. 1 root root   41 Jul 31  2021 dbus-org.freedesktop.timedate1.service -> /usr/lib/systemd/system/timedatex.service
lrwxrwxrwx. 1 root root   41 Jul 31  2021 default.target -> /usr/lib/systemd/system/multi-user.target
drwxr-xr-x. 2 root root   32 Jul 31  2021 getty.target.wants
drwxr-xr-x. 2 root root 4096 Mar 19 19:55 multi-user.target.wants
drwxr-xr-x. 2 root root   48 Jul 31  2021 network-online.target.wants
-rw-r--r--. 1 root root  115 Mar 19 02:15 server1.service
-rw-r--r--. 1 root root  112 Mar 19 02:15 server1.timer
-rw-r--r--. 1 root root  115 Mar 19 02:15 server2.service
-rw-r--r--. 1 root root  112 Mar 19 02:15 server2.timer
drwxr-xr-x. 2 root root   72 Jul 31  2021 sockets.target.wants
drwxr-xr-x. 2 root root   59 Feb 23 07:42 sshd-keygen@.service.d
drwxr-xr-x. 2 root root  207 Jul 31  2021 sysinit.target.wants
lrwxrwxrwx. 1 root root   39 Jul 31  2021 syslog.service -> /usr/lib/systemd/system/rsyslog.service
lrwxrwxrwx. 1 root root    9 Oct 16  2019 systemd-timedated.service -> /dev/null
-rw-r--r--. 1 root root  109 Mar 19 19:52 task1.service
-rw-r--r--. 1 root root  110 Mar 19 19:52 task1.timer

drwxr-xr-x. 2 root root  227 Mar 19 19:52 timers.target.wants

 

Los archivos marcados en negrita son las configuraciones de la tarea task1. El archivo task1.service define el servicio de la ejecución de la tarea, el archivo task1.timer define la programación de la tarea con los intervalos de tiempo.

Este ejemplo se hizo en un servidor con distribución AlmaLinux8 y tenía desactivada SeLinux (setenforce 0). Si deseas que funcione con SeLinux activado, prepararé otro post dando los pasos para hacerlo funcionar con SeLinux.

Saludos,