Como crear tareas usando Systemd Timers

    Angel Briceño

    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,