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.timerecho "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 leftMar 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,