fbpx Systemd Timer en Linux: Programar tareas sin el cron | Certificação Linux

Systemd Timer en Linux: Reemplazar el cron con programación systemd

📅 07/12/2021 ⏱ 6 min ✍️ Uira Ribeiro
Linuxcomandos
Systemd Timer en Linux: Reemplazar el cron con programación systemd
Exam Pass App — mais de 7.000 questões LPI, offline, em 5 idiomas, disponível no Android e na App Store
Disponible en
Google Play
Disponible en
App Store

El administrador de servicios Systemd también mantiene un servicio de programación de tareas que puede ser utilizado en sustitución de cron. Algunas distribuciones ya no instalan cron como predeterminado, utilizando solamente systemd-timer en Linux.

Con el tiempo, las distribuciones han ido prefiriendo systemd para las tareas de mantenimiento del sistema.

Systemd utiliza archivos de unidades (units) de tiempo llamados "Timers" que controlan los servicios o eventos que serán ejecutados por systemd. Estos archivos tienen la extensión .timer y residen generalmente en el directorio /lib/systemd/system.

Aunque la utilización de la programación de systemd puede ser un poco más compleja que en cron, hay algunas ventajas:

  • Cada tarea tiene su propia unit de tiempo, o más de una si es necesario;
  • Las units de tiempo pueden llamar cualquier unit, sea de servicio, montaje, socket, etc;
  • Las units de tiempo pueden ser ejecutadas manualmente;
  • Las units de tiempo pueden depender de otros servicios o de otras unidades para ser ejecutadas, formando una lógica para ejecución de programas o servicios;
  • Las units pueden ser agrupadas;
  • Los trabajos ejecutados son registrados en el journal de systemd, lo que facilita la depuración;

Las unidades de tiempo pueden ser de dos tipos:

  • Timers de tiempo real: son activados por un evento de calendario, de la misma forma que cron. La opción OnCalendar en la unit de tiempo es usada para definir este tipo de unidad de tiempo.
  • Timers monotónicos: son activados después de cierto tiempo (en segundos) en relación a un evento específico. Este evento puede ser después de activado el servicio del timer (OnActiveSec), después del inicio del equipo (OnBootSec), después de que el servicio de systemd fue activado (OnStartupSec) y después de que una unidad de tiempo quedó activa por última vez (OnUnitActiveSec).

Para crear una tarea de timer de systemd, es necesario crear dos archivos de unidades: una de tiempo y otra con el servicio o comando que será ejecutado. Primero se puede crear la unit de tiempo:

[Unit]Description=Backup do MySQL[Timer]OnCalendar=*-*-* 03:00:00Unit=backup.service[Install]WantedBy=multi-user.target

Esta unit debe ficar en el directorio /usr/lib/systemd/system/ con el nombre backup.timer. Observe que se ejecutará todos los días a las 03 horas de la mañana, y llamará a la unit backup.service. Ahora es necesario crear la unit de servicio que será ejecutada por la unit backup.timer:

[Unit]Description=Backup do MySQL[Service]Type=simpleExecStart=/var/backup.sh[Install]WantedBy=multi-user.target

Este archivo también debe ficar en el directorio /usr/lib/systemd/system/ con el nombre backup.service. Observe que esta unit ejecutará el script /var/backup.sh. Este script a su vez deberá tener permiso de ejecución "X". Hecho esto, se debe habilitar la unit del temporizador para ejecutarse en el inicio con la opción "enable" del comando systemctl:

# systemctl enable backup.timer

Y también colocarla en ejecución con la opción "start" del comando systemctl:

# systemctl start backup.timer

Cada vez que sea necesario alterar la configuración de una unit, es preciso reiniciar el servicio de systemd:

# systemctl daemon-reload

Para visualizar las units de tiempo que están configuradas, se puede usar la opción "list-timers" del comando systemctl:

# systemctl list-timersNEXT        LEFT   LAST        UNIT         ACTIVATES2019-10-19  10h    2019-10-18  backup.timer backup.service

Para listar todas las units de tiempo, incluso aquellas que no están activas, se puede usar la opción "list-timers --all":

# systemctl list-timers --allNEXT        LEFT   LAST        UNIT         ACTIVATES2019-10-18  8min   2019-10-18  dnf.timer    dnf-makecache.service2019-10-19  13h    2019-10-18  tmp.timer    tmpfiles-clean.servicen/a         n/a     n/a        read.timer   readahead-done.service3 timers listed.

Para detener la unit de tiempo, se puede usar la opción "stop" del comando systemctl:

# systemctl stop backup.timer

Y se puede ejecutar la unit de backup.service en cualquier momento con el comando:

# systemctl start backup.service

Unidades de Tiempo Transitorias (Transientes)

Systemd también puede ser utilizado para crear units de tiempo transitorias (transientes), que ejecutarán una única vez en una fecha determinada, sin necesidad de crear una unidad de servicio.

Para hacer esto, utilizamos el comando systemd-run.

systemd-run

Las opciones que systemd-run acepta son:

  • --on-active=: número de segundos después de que el sistema de timer quedó activo.
  • --on-boot=: número de segundos después de que el equipo se inició.
  • --on-startup=: número de segundos después de que systemd se inició.
  • --on-unit-active=: número de segundos después de que una unit quedó activa
  • --on-unit-inactive=: número de segundos después de que una unit quedó inactiva
  • --on-calendar=: fecha en el calendario para ejecución de la tarea.

Ejemplos:

En este ejemplo, el timer creará un archivo llamado /tmp/archivo después de 30 segundos de haber sido activado:

# systemd-run --on-active=30 /bin/touch /tmp/arquivoRunning timer as unit run-1642.timer.Will run service as unit run-1642.service.

La ejecución del timer puede ser visualizada en el Journal de Systemd con el comando journalctl:

# journalctl -b -u run-1642.service-- Logs begin at Tue 2019-04-09 15:46:28 -03Oct 18 16:05:05 systemd[1]: Started /bin/touch /tmp/arquivo.

Para ejecutar el comando updatedb en una fecha determinada, se puede usar la opción "--on-calendar=" seguida de una fecha entre comillas:

# systemd-run --on-calendar="sun 13:50" updatedbRunning timer as unit run-2948.timer.Will run service as unit run-2948.service.

Después de creada la unidad de tiempo y de servicio con systemd-run, se puede usar el comando "systemctl list-timers" para ver la unit timer creada:

# systemctl list-timersNEXT              UNIT            ACTIVATES2019-10-20 13:50  run-2948.timer  run-2948.service

El contenido de la unit creada por systemd-run puede ser visto con el comando "systemctl cat run-2948":

# systemctl cat run-2948[Unit]Description=/bin/updatedb[Service]ExecStart=@/bin/updatedb "/bin/updatedb"

Aprende mucho más sobre Linux en nuestro curso en línea. Puedes realizar la matrícula aquí. Si ya tienes una cuenta, o quieres crear una, simplemente ingresa o crea tu usuario aquí.

¿Te gustó? Comparte

Uira Ribeiro

Prof. Uirá Ribeiro

Chair do Board do Linux Professional Institute

Después de años viendo profesionales perder horas en tareas simples por no conocer las herramientas correctas de Linux, decidí enseñar.
Hoy soy autor de la mayoría de los Materiales de Aprendizaje oficiales de la LPI y mentor de más de 14,000 alumnos certificados.

Conoce mi historia completa →

Eso fue solo una pieza. El curso enseña el camino completo — desde tu primer comando hasta el día del examen.

Certificação Linux — a plataforma líder em certificações Linux no Brasil
WhatsApp