Trabajar con los temporizadores en Systemd
Explica cómo funcionan las unidades de temporizador systemd y cómo configurar temporizadores en tiempo real, monotónicos y transitorios.
Los archivos de unidad de temporizador son un tipo de archivo systemd que la utilidad systemctl utiliza para programar tareas, de forma similar a la utilidad cron que utiliza crontab y otros trabajos cron para el mismo fin.
Tenga en cuenta que el daemon cron se ejecuta como un servicio dentro de systemd, por lo que se prefieren las unidades de temporizador porque eliminan una capa de procesamiento agregado y ofrecen mucha más utilidad y configuración más granular que la disponible en el servicio cron.
Normalmente, los paquetes que utilizan servicios específicos para funcionar en el sistema incluyen sus propios archivos de unidad de temporizador systemd. Por lo tanto, cuando estos paquetes se instalan con Oracle Linux, los archivos de la unidad de temporizador se incluyen automáticamente. Puede mostrar los archivos de temporizador en el sistema con el siguiente comando:
systemctl list-unit-files --type=timer
La lista de archivos de temporizador puede variar según dónde se ejecute Oracle Linux, como en una instancia de Oracle Cloud Infrastructure, un sistema físico, etc.
Cada archivo de unidad de temporizador contiene valores de parámetros que gestionan la programación de una tarea. Por ejemplo, el programa para ejecutar dnf-makecache.service se define en el archivo dnf-makecache.timer. El archivo contiene la siguiente configuración:
systemctl cat dnf-makecache.timer
# /usr/lib/systemd/system/dnf-makecache.timer
[Unit]
Description=dnf makecache --timer
ConditionKernelCommandLine=!rd.live.image
# See comment in dnf-makecache.service
ConditionPathExists=!/run/ostree-booted
Wants=network-online.target
[Timer]
OnBootSec=10min
OnUnitInactiveSec=1h
RandomizedDelaySec=60m
Unit=dnf-makecache.service
[Install]
WantedBy=timers.target
La información del programa se especifica en la Sección [Timer].
En la configuración de ejemplo, el servicio dnf-makecache.service se define para que se ejecute automáticamente 10 minutos después de que se inicie el sistema. A continuación, el servicio pasa al modo inactivo durante una hora, según lo especificado por el parámetro OnUnitInactiveSec. Al final de la hora, el servicio se vuelve a ejecutar. Este ciclo continúa cada hora indefinidamente.
El valor RandomizedDelaySec proporciona un límite de valor para cuánto se puede retrasar una ejecución más allá de su programa.
En el ejemplo, se permite que el servicio se ejecute un minuto después de su programación a más tardar. Este parámetro es útil para evitar demasiados trabajos que se inicien al mismo tiempo en un programa especificado, lo que de otro modo podría suponer la sobrecarga de los recursos.
OnCalendar es otro parámetro útil para la programación de tareas. Supongamos que el parámetro se establece de la siguiente manera:
OnCalendar=*:00/10
El valor *:00 indica cada hora en la parte superior de la hora, mientras que el valor /10 indica 10 minutos. Por lo tanto, el trabajo se define para que se ejecute cada hora, diez minutos después de la hora más alta.
Para obtener una lista completa de los parámetros del archivo de unidad de temporizador systemd para programar un trabajo, consulte las páginas del manual systemd.timer(5).
Para obtener un tutorial sobre cómo utilizar
systemd en Oracle Linux, incluida la configuración de archivos de unidad de temporizador systemd, consulte https://docs.oracle.com/en/learn/ol-systemd/.Uso de unidades de temporizador para controlar el tiempo de ejecución de la unidad de servicio
Explica cómo las unidades de temporizador reemplazan los trabajos cron y cómo inspeccionar, activar y supervisar los servicios activados por temporizador.
Las unidades de temporizador se pueden configurar para controlar cuándo se ejecutan las unidades de servicio.
Puede utilizar unidades de temporizador en lugar de configurar el daemon cron para eventos basados en tiempo. Las unidades de temporizador pueden ser más complicadas de configurar que crear una entrada crontab. Sin embargo, las unidades de temporizador son más configurables y los servicios que controlan se pueden configurar para un mejor registro y una integración más profunda con la arquitectura systemd.
Las unidades de temporizador se inician, activan y detienen de manera similar a las unidades de servicio. Por ejemplo, para activar e iniciar una unidad de temporizador inmediatamente, escriba:
sudo systemctl enable --now myscript.timer
Para mostrar todos los temporizadores existentes en el sistema, para ver cuándo se ejecutaron por última vez y cuándo se configuraron para ejecutarse, escriba:
systemctl list-timers
Para obtener más información sobre los temporizadores del sistema, consulte las páginas del manual systemd.timer(5) y systemd.time(7).
Configuración de una Unidad de Temporizador en Tiempo Real
Los temporizadores en tiempo real se activan en un evento de calendario, de forma similar a los eventos de un crontab. La opción OnCalendar especifica cuándo el temporizador ejecuta un servicio.
-
Si es necesario, cree un archivo
.serviceque defina el servicio que disparará la unidad de temporizador. En el siguiente procedimiento, el servicio de ejemplo es/etc/systemd/system/update.service, que es una unidad de servicio que ejecuta una secuencia de comandos de actualización.Para obtener más información sobre la creación de unidades de servicio, consulte Creating a User-Based systemd Service.
-
Decida la hora y la frecuencia de ejecución del servicio. En este procedimiento, el temporizador está configurado para ejecutar el servicio cada 2 horas de lunes a viernes.
Esta tarea muestra cómo crear un temporizador del sistema para activar la ejecución de un servicio en función de un evento de calendario. La definición del evento de calendario es similar a las entradas que se incluyen en un trabajo cron.
Configuración de una unidad de temporizador monotónica
Los temporizadores monotónicos se activan después de un intervalo de tiempo relativo a un punto de inicio variable, como un evento de inicio, o cuando una unidad systemd concreta se activa. Estas unidades de temporizador se detienen si el equipo está temporalmente suspendido o apagado. Los temporizadores monotónicos se configuran mediante la opción OnTypeSec, donde Type es el nombre del evento al que está relacionado el temporizador. Los temporizadores monotónicos comunes incluyen OnBootSec y OnUnitActiveSec.
-
Si es necesario, cree un archivo
.serviceque defina el servicio que disparará la unidad de temporizador. En el siguiente procedimiento, el servicio de ejemplo es/etc/systemd/system/update.service, que es una unidad de servicio que ejecuta una secuencia de comandos de actualización.Para obtener más información sobre la creación de unidades de servicio, consulte Creating a User-Based systemd Service.
-
Decida la hora y la frecuencia de ejecución del servicio. En este procedimiento, el temporizador está configurado para ejecutar el servicio 10 minutos después del inicio de un sistema y cada 2 horas desde la última vez que se activa el servicio.
Esta tarea le muestra cómo crear un temporizador del sistema para activar un servicio para que se ejecute en eventos específicos, que son cuando el sistema se inicia o después de 2 horas transcurridas desde la activación del temporizador.
Ejecución de una unidad de temporizador transitorio
Demuestra cómo iniciar temporizadores puntuales con systemctl run para que pueda programar tareas ad hoc sin crear archivos de unidad.
Los temporizadores temporales son temporizadores temporales que sólo son válidos para la sesión actual.
Estos temporizadores se pueden crear para ejecutar un programa o secuencia de comandos directamente sin necesidad de configurar unidades de servicio o temporizador en systemd. Estas unidades se generan mediante el comando systemd-run. Consulte la página del manual systemd-run(1) para obtener más información.
Las opciones de parámetros que agregaría al archivo unit-file.timer también sirven como argumentos al utilizar el comando systemd-run para ejecutar una unidad de temporizador temporal.
Los siguientes ejemplos muestran cómo utilizar systemd-run para activar temporizadores transitorios.
-
Ejecute
update.servicedespués de que hayan transcurrido 2 horas.sudo systemd-run --on-active="2h" --unit update.service -
Cree
~/tmp/myfiledespués de 1 hora.sudo systemd-run --on-active="1h" /bin/touch ~/tmp/myfile -
Ejecute
~/myscripts/update.sh5 minutos después de que se inicie el gestor de servicios. Utilice esta sintaxis para ejecutar un servicio después de que el gestor de servicios se haya iniciado al iniciar sesión el usuario.sudo systemd-run --on-startup="5m" ~/myscripts/update.sh -
Ejecute
myjob.service10 minutos después del inicio del sistema.sudo systemd-run --on-boot="10m" --unit myjob.service -
Ejecute
report.serviceal final del día.sudo systemd-run --on-calendar="17:00:00"