Uso de los temporizadores systemd
- DESCRIPCIÓN
Hay muchas tareas que requieren programación en un sistema Linux: desde la ejecución de un guion de copia de seguridad a intervalos regulares hasta el inicio de un proceso específico tan pronto como arranca el equipo. Los temporizadores
systemd
proporcionan un mecanismo flexible para programar y gestionar trabajos y servicios.- INTENCIÓN
El objetivo de este artículo es proporcionar una descripción completa de los temporizadores
systemd
, que cubre la creación, el mantenimiento, las pruebas, la resolución de problemas y la migración desde cron.- ESFUERZO
La creación de un temporizador
systemd
de ejemplo lleva unos 10 minutos. Necesitará hasta 30 minutos para comprender completamente cómo funcionan los temporizadoressystemd
.- REQUISITOS
Conocimientos básicos de
systemd
.Privilegios de
root
o sudo. Para utilizar temporizadoressystemd
como usuario normal, consulte primero la Sección 7, “Uso de temporizadores como usuario normal”.
1 El concepto de temporizador systemd
#
Las unidades de un temporizador systemd
proporcionan un mecanismo para programar trabajos en Linux. El tiempo de ejecución de estos trabajos puede basarse en la hora y la fecha o en eventos.
Las unidades de un temporizador systemd
se identifican por la extensión de nombre de archivo .timer
. Cada archivo de temporizador requiere el archivo de servicio correspondiente que controla. En otras palabras, un archivo de temporizador activa y gestiona el archivo de servicio correspondiente. Los temporizadores systemd
admiten las siguientes funciones:
Los trabajos programados mediante una unidad de temporizador pueden depender de otros servicios
systemd
. Las unidades de temporizador se tratan como serviciossystemd
regulares, por lo que se pueden gestionar consystemctl
.Los temporizadores pueden ser en tiempo real (se activan en eventos del calendario) o monotónicos (se activan cuando ha transcurrido un tiempo especificado desde un punto de inicio determinado).
Las unidades de tiempo se registran en el diario del sistema, lo que facilita su monitorización y la resolución de problemas.
Los temporizadores utilizan los servicios de gestión
systemd
centralizados.Si el sistema está apagado durante el tiempo de ejecución previsto, el temporizador se ejecuta una vez que el sistema se vuelve a ejecutar.
2 Creación de un temporizador #
El siguiente ejemplo muestra cómo configurar un temporizador que active el guion de shell helloworld.sh
después del tiempo de arranque y repita su ejecución cada 24 horas en relación con su tiempo de activación. También funciona de lunes a viernes a las 10 de la mañana.
2.1 Ejemplo de Hello World #
Cree el archivo
/etc/systemd/system/helloworld.service
con el siguiente contenido:[Unit] Description="Hello World script" [Service] ExecStart=/usr/local/bin/helloworld.sh
Se trata de un archivo de servicio
systemd
que indica asystemd
qué aplicación se debe ejecutar.Cree el archivo
/etc/systemd/system/helloworld.timer
con el siguiente contenido:[Unit] Description="Run helloworld.service 5min after boot and every 24 hours relative to activation time" [Timer] OnBootSec=5min OnUnitActiveSec=24h OnCalendar=Mon..Fri *-*-* 10:00:* Unit=helloworld.service [Install] WantedBy=multi-user.target
Este es el archivo de temporizador que controla la activación del archivo de servicio respectivo.
Compruebe que los archivos que ha creado anteriormente no contienen errores:
>
systemd-analyze verify /etc/systemd/system/helloworld.*Si el comando no devuelve ningún resultado, los archivos han pasado la verificación correctamente.
Inicie el temporizador:
>
sudo
systemctl start helloworld.timerEsto solo activa el temporizador para la sesión actual.
Habilite el temporizador para asegurarse de que está activado al arrancar:
>
sudo
systemctl enable helloworld.timer
2.2 Explicación del ejemplo #
[Unit] Description="Hello World script"1 [Service] ExecStart=/usr/local/bin/helloworld.sh2
Una breve descripción de la finalidad del archivo de servicio. | |
La aplicación que se va a ejecutar. |
Las secciones [Unit]
y [Service]
son las secciones mínimas necesarias para que funcione un archivo de servicio. Los archivos de servicio systemd
normalmente contienen una sección [Install]
que determina uno o más destinos para que se cargue un servicio. Esta sección no es necesaria en los archivos de servicio de los temporizadores, ya que esta información se proporciona con el archivo de temporizador. Para obtener información sobre la configuración avanzada, consulte Managing
systemd
targets with systemctl
[Unit] Description="Run helloworld.service 5min after boot and every 24 hours relative to activation time"1 [Timer] OnBootSec=5min2 OnUnitActiveSec=24h3 OnCalendar=Mon..Fri *-*-* 10:00:*4 Unit=helloworld.service5 [Install] WantedBy=multi-user.target6
Una breve descripción del propósito del archivo de temporizador. | |
Especifica un temporizador que activa el servicio cinco minutos después del arranque del sistema. Consulte Temporizadores monotónicos para obtener más información. | |
Especifica un temporizador que activa el servicio 24 horas después de que se haya activado (es decir, el temporizador activa el servicio una vez al día). Consulte Temporizadores en tiempo real para obtener más información. | |
Especifica un temporizador que activa el servicio en momentos determinados (en este ejemplo, de lunes a viernes a las 10 de la mañana). Consulte Temporizadores en tiempo real para obtener más información. | |
El archivo de servicio que se va a ejecutar. | |
El destino de |
3 Gestión de temporizadores #
Puede gestionar los temporizadores mediante el comando systemctl
.
- Iniciar y detener temporizadores
>
sudo
systemctl start TIMER.timer>
sudo
systemctl restart TIMER.timer>
sudo
systemctl stop TIMER.timer- Habilitar e inhabilitar temporizadores
>
sudo
systemctl enable TIMER.timer>
sudo
systemctl disable TIMER.timer- Mostrar el contenido del archivo del temporizador
>
sudo
systemctl cat TIMER.timer- Comprobar un temporizador específico
>
sudo
systemctl status TIMER.timerEjemplo 3: Estado del temporizador #>
sudo
systemctl status helloworld.timer ● helloworld.timer - "Run helloworld.service 5min after boot and every 24 hours relative to activation time"1 Loaded: loaded (/etc/systemd/system/helloworld.timer; disabled; vendor preset: disabled)2 Active: active (waiting) since Tue 2022-10-26 18:35:41 CEST; 6s ago3 Trigger: Wed 2022-10-27 18:35:41 CEST; 23h left4 Triggers: ● helloworld.service5 6 Oct 26 18:35:41 neo systemd[1]: Started "Run helloworld.service 5min after boot and every 24 hours relative to activation time".7El nombre y la descripción del archivo del temporizador.
Muestra si un temporizador se ha analizado correctamente y se mantiene en la memoria (está cargado), muestra la vía completa al archivo del temporizador y muestra si el temporizador se está iniciando en el momento del arranque (está habilitado) o no (está inhabilitado). El primer valor muestra la configuración actual del sistema, el segundo el valor preestablecido por el proveedor.
Indica si el temporizador está activo (a la espera de activar eventos) o inactivo. Si está activo, también muestra el tiempo transcurrido desde la última activación (6 segundos en este ejemplo).
La próxima fecha y hora a la se activa el temporizador.
Nombre del archivo de servicio que activa el temporizador.
Línea opcional que dirige a la documentación (por ejemplo, páginas man). Si no está disponible, se muestra una línea vacía (como en este ejemplo).
Entrada de diario más reciente creada por el temporizador.
Para mostrar todos los temporizadores disponibles en el sistema, utilice systemctl list-timers
. Están disponibles las siguientes opciones:
- Mostrar todos los temporizadores activos:
>
sudo
systemctl list-timers- Mostrar todos los temporizadores, incluidos los inactivos:
>
sudo
systemctl list-timers --all- Mostrar todos los temporizadores que coinciden con un patrón:
>
sudo
systemctl list-timers PATTERN>
sudo
systemctl list-timers --allPATTERNPATTERN debe ser un nombre o una expresión global de shell. Se pueden utilizar los operadores
*
,?
y[]
. Consulteman 7 glob
para obtener más información sobre los patrones globales.- Mostrar los temporizadores que coinciden con un estado determinado:
>
sudo
systemctl list-timers --state=STATESTATE toma los siguientes valores:
active
,failed
,load
osub
. Consulte laman systemctl
para obtener más información.
Al ejecutar cualquier systemctl list-timers
, se muestra una tabla similar a la siguiente. En este ejemplo, se muestran todos los temporizadores activos que coinciden con el patrón snapper*
:
>
sudo
systemctl list-timers snapper* NEXT1 LEFT2 LAST3 PASSED4 UNIT5 ACTIVATES6 ----------------------------------------------------------------------------------------------------------------------------- Tue 2022-10-26 19:00:00 CEST 39min left Tue 2022-10-26 18:00:29 CEST 19min ago snapper-timeline.timer snapper-timeline.service Wed 2022-10-27 08:33:04 CEST 14h left Tue 2022-10-26 08:33:04 CEST 9h ago snapper-cleanup.timer snapper-cleanup.service
El momento en el que se ejecutará el temporizador la próxima vez. | |
El tiempo que queda hasta la próxima ejecución del temporizador. | |
El momento en el que se ejecutó el temporizador por última vez. | |
El tiempo transcurrido desde la última ejecución del temporizador. | |
El nombre de la unidad de temporizador. | |
El nombre del servicio que activa el temporizador. |
4 Tipos de temporizador #
systemd
admite dos tipos de temporizadores: en tiempo real (basado en el calendario) y monotónico (basado en eventos). Aunque los temporizadores suelen ser persistentes, systemd
también permite configurar temporizadores transitorios que solo son válidos para la sesión actual.
- Temporizadores en tiempo real
Los temporizadores en tiempo real se activan mediante eventos de calendario. Se definen mediante la opción
OnCalendar
.Puede especificar cuándo se debe activar un evento según la fecha y la hora. Use la plantilla siguiente:
OnCalendar=DayOfWeek1 Year-Month-Day2 Hour:Minute:Second3
Día de la semana. Los valores posibles son
Sun
,Mon
,Tue
,Wed
,Thu
,Fri
ySat
. Omita la opción para ignorar el día de la semana.Fecha. Especifique el mes y el día con dos dígitos, y el año con cuatro dígitos. Cada valor se puede sustituir por el comodín
*
para que coincida con cada aparición.Hora. Especifique cada valor con dos dígitos. Cada valor se puede sustituir por el comodín
*
para que coincida con cada aparición.Se aplica a todos los valores: utilice dos puntos para definir un intervalo continuo (
Mon..Fri
). Utilice comas para delimitar una lista de valores separados (Mon,Wed,Fri
).Ejemplo 5: Ejemplos de temporizador en tiempo real #A las 6 de la tarde todos los viernes:
OnCalendar=Fri *-*-* 18:00:00
A las 5 de la mañana todos los días:
OnCalendar=Mon..Sun *-*-* 5:00:00
A la 1 y las 3 de la mañana los domingos y martes:
OnCalendar=Tue,Sun *-*-* 01,03:00:00
Fecha única:
OnCalendar=Mo..Sun 2023-09-23 00:00:01
Para especificar activadores en momentos diferentes, puede crear más de una entrada OnCalendar en un único archivo de temporizador:
OnCalendar=Mon..Fri *-*-* 10:00 OnCalendar=Sat,Sun *-*-* 22:00
Para obtener una lista completa de las funciones y opciones disponibles, consulte
man 7 systemd.time
, que ofrece información adicional sobre los siguientes temas:acortar la sintaxis y utilizar abreviaturas
especificar repeticiones
buscar días específicos en un mes (último día del mes, último domingo, etc.)
aplicar zonas horarias
- Temporizadores monotónicos
Los temporizadores monotónicos se activan cuando ha transcurrido un tiempo especificado desde un evento determinado, como un evento de arranque del sistema o de activación de una unidad del sistema. Los valores se definen como unidades de tiempo (minutos, horas, días, meses, años, etc.). Se admiten las siguientes unidades:
usec
,msec
,seconds
,minutes
,hours
,days
,weeks
,months
,years
. Existen varias opciones para definir temporizadores monotónicos:OnActiveSec
: tiempo tras la activación de la unidadOnActiveSec=50minutes
OnBootSec
: tiempo tras el arranque del sistemaOnBootSec=10hours
OnStartupSec
: tiempo desde que se inicia el gestor de servicios. Para los servicios del sistema, esto es casi igual aOnActiveSec
. Utilícelo para los servicios de usuario en los que el gestor de servicios se inicia cuando el usuario inicia sesión.OnStartupSec=5minutes 20seconds
OnUnitActiveSec
: tiempo transcurrido desde la última activación del servicio correspondienteOnUnitActiveSec=10seconds
OnUnitInactiveSec
: tiempo transcurrido desde la última desactivación del servicio correspondienteOnUnitInactiveSec=2hours 15minutes 18 seconds
- Temporizadores transitorios
Los temporizadores transitorios son temporizadores temporales que solo son válidos para la sesión actual. Con estos temporizadores, puede utilizar un archivo de servicio existente o iniciar un programa directamente. Los temporizadores transitorios se invocan ejecutando
systemd-run
.El siguiente ejemplo ejecuta la unidad
helloworld.service
cada dos horas:>
sudo
systemd-run --on-active="2hours" --unit="helloworld.service"Para ejecutar un comando directamente, utilice la siguiente sintaxis. En este ejemplo, se llama directamente al guion
/usr/local/bin/helloworld.sh
:>
sudo
systemd-run --on-active="2hours" /usr/local/bin/helloworld.shSi el comando toma parámetros, añádalos separados por un espacio:
>
sudo
systemd-run --on-active="2hours" /usr/local/bin/helloworld.sh --language=pt_BRLos temporizadores transitorios pueden ser monotónicos o en tiempo real. Los siguientes conmutadores son compatibles y funcionan como se describe en Temporizadores monotónicos:
--on-active
--on-startup
--on-unit-active
--on-unit-inactive
--on-calendar
Para obtener más información, consulte el
man 1 systemd-run
.
5 Prueba de entradas de calendario #
systemd
proporciona una herramienta para probar y crear entradas de temporizador de calendario para temporizadores en tiempo real: systemd-analyze calendar
. Acepta los mismos argumentos que la entrada OnCalendar
necesaria para configurar temporizadores en tiempo real.
Puede concatenar varios argumentos separados por un espacio. Si el término que se va a probar es correcto, el resultado muestra cuándo se activa el temporizador (en hora local y UTC). También muestra la cadena en Normalized form
, y se recomienda utilizar esa cadena en el archivo del temporizador. Considere los siguientes ejemplos:
>
systemd-analyze calendar "Tue,Sun *-*-* 01,03:00:00" Normalized form: Tue,Sun *-*-* 01,03:00:00 Next elapse: Sun 2021-10-31 01:00:00 CEST (in UTC): Sat 2021-10-30 23:00:00 UTC From now: 3 days left>
systemd-analyze calendar "Mon..Fri *-*-* 10:00" "Sat,Sun *-*-* 22:00" Original form: Mon..Fri *-*-* 10:00 Normalized form: Mon..Fri *-*-* 10:00:00 Next elapse: Thu 2021-10-28 10:00:00 CEST (in UTC): Thu 2021-10-28 08:00:00 UTC From now: 19h left Original form: Sat,Sun *-*-* 22:00 Normalized form: Sat,Sun *-*-* 22:00:00 Next elapse: Sat 2021-10-30 22:00:00 CEST (in UTC): Sat 2021-10-30 20:00:00 UTC From now: 3 days left
Para los temporizadores periódicos, utilice el conmutador –iterations N
para mostrar las horas de activación y, a continuación, compruebe si funcionan como se espera. El argumento N especifica el número de iteraciones que desea probar. La siguiente cadena de ejemplo se activa cada 8 horas (a partir de las 00:00:00) los domingos:
>
systemd-analyze calendar --iterations 5 "Sun *-*-* 0/08:00:00"
Original form: Sun *-*-* 0/08:00:00
Normalized form: Sun *-*-* 00/8:00:00
Next elapse: Sun 2021-10-31 00:00:00 CEST
(in UTC): Sat 2021-10-30 22:00:00 UTC
From now: 3 days left
Iter. #2: Sun 2021-10-31 08:00:00 CET
(in UTC): Sun 2021-10-31 07:00:00 UTC
From now: 3 days left
Iter. #3: Sun 2021-10-31 16:00:00 CET
(in UTC): Sun 2021-10-31 15:00:00 UTC
From now: 4 days left
Iter. #4: Sun 2021-11-07 00:00:00 CET
(in UTC): Sat 2021-11-06 23:00:00 UTC
From now: 1 week 3 days left
Iter. #5: Sun 2021-11-07 08:00:00 CET
(in UTC): Sun 2021-11-07 07:00:00 UTC
From now: 1 week 3 days left
6 Recepción de notificaciones por correo electrónico cuando falla un temporizador #
systemd
no ofrece una función similar a MAILTO de cron. El procedimiento siguiente es una solución alternativa para habilitar las notificaciones por correo electrónico cuando falla un temporizador.
El procedimiento consta de los siguientes pasos:
Cree un guion que envíe un mensaje de correo electrónico.
Cree un archivo de servicio
systemd
que ejecute el guion de correo electrónico.Pruebe el archivo de servicio de correo electrónico.
Desde el servicio que controla el temporizador, llame al archivo de servicio de correo electrónico creado mediante
OnFailure
.
En el siguiente ejemplo, usamos el comando mailx
del paquete mailx. Requiere que el servidor de correo electrónico Postfix esté instalado y configurado correctamente.
Crear el guion
/usr/local/bin/send_systemd_email
.El guion requiere dos parámetros:
$1
, la dirección de correo electrónico y$2
, el nombre del archivo de servicio para el que se recibe la notificación de fallo. Ambos parámetros los proporciona el archivo de unidad que ejecuta el guion de correo.#!/bin/sh systemctl status --full "$2" | mailx -S sendwait\ -s "Service failure for $2" -r root@$HOSTNAME $1
Asegúrese de que el guion sea ejecutable:
>
sudo
chmod 755 /usr/local/bin/send_systemd_email
Cree el archivo
/etc/systemd/system/send_email_to_USER@.service
.[Unit] Description=Send systemd status information by email for %i to USER [Service] Type=oneshot ExecStart=/usr/local/bin/send_systemd_email EMAIL_ADDRESS %i User=root Group=systemd-journal
Sustituya USER y EMAIL_ADDRESS en el archivo con los datos de inicio de sesión y la dirección de correo electrónico del usuario que debe recibir el correo electrónico.
%i
es el nombre del servicio que ha fallado (el parámetro%n
lo pasa al servicio de correo electrónico).Verifique el archivo de servicio y solucione los problemas notificados:
>
systemd-analyze verify /etc/systemd/system/send_email_to_USER@.serviceSi el comando no devuelve ningún resultado, el archivo ha pasado la verificación correctamente.
Para verificar el procedimiento completo, inicie el servicio utilizando la instancia
dbus
de prueba. Puede utilizar cualquier otro servicio que se esté ejecutando; en ese ejemplo se usa dbus porque se garantiza que el servicio se ejecutará en cualquier instalación.>
sudo
systemctl start send_email_to_USER@dbus.serviceSi se verifica correctamente, EMAIL_ADDRESS recibe un mensaje de correo electrónico con el asunto
Service failure for dbus
que contiene mensajes de estado de dbus en el cuerpo. Esto es solo una prueba, no hay ningún problema con el servicio dbus. Puede suprimir el correo electrónico de forma segura, no es necesario realizar ninguna acción.Si el correo electrónico de prueba se ha enviado correctamente, continúe integrándolo en el archivo de servicio.
Para añadir una notificación por correo electrónico al servicio, añada una opción
OnFailure
a la secciónUnit
del archivo de servicio para la que desea recibir una notificación en caso de fallo:[Unit] Description="Hello World script" OnFailure1=send_email_to_USER2@%n3.service [Service] ExecStart=/usr/local/bin/helloworld.sh
La opción
OnFailure
toma un servicio como argumento.Sustituya la parte del nombre de archivo de la unidad de servicio por el nombre de inicio de sesión.
Especifica el nombre del servicio (en este ejemplo,
helloworld
). Este nombre está disponible en el archivo del servicio de correo electrónico como %i.
Ha configurado correctamente la notificación de fallos para los servicios systemd
.
El archivo de servicio de correo electrónico tiene la dirección de correo electrónico del destinatario codificada. Para enviar notificaciones por correo electrónico a un usuario diferente, copie el archivo de servicio de correo electrónico y sustituya los datos de inicio de sesión del usuario en el nombre del archivo y la dirección de correo electrónico en la copia.
Para enviar una notificación de fallo a varios destinatarios simultáneamente, añada los archivos de servicio correspondientes al archivo de servicio (utilice espacios como separadores):
OnFailure=send_email_to_tux@%n.service send_email_to_wilber@%n.service
7 Uso de temporizadores como usuario normal #
Los usuarios normales también pueden utilizar temporizadores systemd
. Les ayudan a automatizar tareas periódicas como las copias de seguridad, el procesamiento de imágenes o el traslado de datos a la nube.
Son válidos los mismos procedimientos y tareas que para los temporizadores de todo el sistema. Sin embargo, se aplican las siguientes diferencias:
Los archivos de temporizador y servicio deben colocarse en
~/.config/systemd/user/
.Todos los comandos
systemctl
yjournalctl
deben ejecutarse con el conmutador‑‑user
.systemd-analyze
no requiere esta opción.Como usuario normal, debe proporcionar la vía a los archivos de unidad, como en los ejemplos siguientes. Si no lo hace y existe un temporizador para todo el sistema con el mismo nombre, este se ejecutará o se mostrará en su lugar.
>
systemctl --user start ~/.config/systemd/user/helloworld.timer>
systemctl --user enable ~/.config/systemd/user/helloworld.timer>
systemctl --user list-timers>
journalctl --user -u helloworld.*>
systemd-analyze verify ~/.config/systemd/user/helloworld.timer
Al igual que con otros servicios systemd
que inicia como usuario normal, los temporizadores de usuario solo se ejecutan cuando el usuario ha entrado en la sesión. En su lugar, para iniciar los temporizadores de usuario en el momento del arranque y mantenerlos en ejecución después de salir de la sesión, habilite la persistencia para cada usuario afectado:
sudo loginctl enable-linger USER
Para obtener más información, consulte el man 1 loginctl
.
La instancia de usuario systemd
no hereda las variables de entorno definidas por guiones como ~/.profile
o ~/.bashrc
. Para comprobar el entorno systemd
, ejecute systemctl --user show-environment
.
Para importar las variables que faltan en el entorno systemd
, especifique el siguiente comando al final de su ~/.bashrc
:
systemctl --user import-environment VARIABLE1 VARIABLE2
8 Migración de cron a temporizadores systemd
#
Todos los trabajos cron se pueden migrar a temporizadores systemd
. Aquí encontrará instrucciones y un ejemplo.
Cree un archivo de servicio ejecutando el guion. Consulte el Ejemplo 1, “El archivo de servicio” para obtener más información.
Cree un archivo de temporizador ejecutando el archivo de servicio. Consulte el Ejemplo 2, “El archivo del temporizador” para ver las instrucciones generales.
Convierta las entradas de calendario. La hora se especifica de forma diferente en cron y en
systemd
. Utilice los patrones siguientes como plantilla de conversión:Cron: Minute Hour Day Month DayOfWeek systemd: OnCalendar=DayOfWeek Year-Month-Day Hour:Minute:Second
Para probar la entrada de calendario convertida, siga las instrucciones de la Sección 5, “Prueba de entradas de calendario”.
Convierta los apodos cron (
@NICK
):Cron :
systemd
timer -------- : ---------------------------- @reboot : OnBootSec=1s @yearly : OnCalendar=*-01-01 00:00:00 @annually: OnCalendar=*-01-01 00:00:00 @monthly : OnCalendar=*-*-01 00:00:00 @weekly : OnCalendar=Sun *-*-* 00:00:00 @daily : OnCalendar=*-*-* 00:00:00 @hourly : OnCalendar=*-*-* *:00:00Convierta las asignaciones de variables. La asignación de variable
systemd
debe ir a la sección[Service]
. No es posible convertirMAILTO
de esta forma; consulte el siguiente paso.cron: VARIABLE=VALUE systemd: Environment="VARIABLE=VALUE"
Configure las notificaciones por correo electrónico para reemplazar la función MAILTO de cron siguiendo las instrucciones de la Sección 6, “Recepción de notificaciones por correo electrónico cuando falla un temporizador”.
systemd
#
Estas son las entradas de crontab que llaman al guion helloworld.sh
5 minutos después del arranque y a las 10 en punto de cada lunes a viernes:
@reboot sleep 300 && /usr/local/bin/helloworld.sh 0 10 * * * 1-5 /usr/local/bin/helloworld.sh
El archivo de servicio systemd
(helloworld.service
) que llama al guion tiene este aspecto:
[Unit] Description="Hello World script" [Service] ExecStart=/usr/local/bin/helloworld.sh
El archivo del temporizador (helloworld.timer
) tiene este aspecto:
[Unit] Description="Run helloworld.service 5min after boot and at 10am every Mon-Fri" [Timer] OnBootSec=5min OnCalendar=Mon..Fri *-*-* 10:00:* Unit=helloworld.service [Install] WantedBy=multi-user.target
9 Resolución de problemas y preguntas frecuentes #
Aprenda a depurar y solucionar problemas de temporizadores systemd
que hayan fallado. Encuentre respuestas a preguntas frecuentes sobre los temporizadores systemd
.
9.1 Cómo evitar errores #
Para evitar errores con los temporizadores systemd
, asegúrese de seguir estas prácticas recomendadas:
Compruebe que el ejecutable que especifique en el servicio con
ExecStart
se ejecute correctamente.Compruebe la sintaxis de los archivos de servicio y temporizador ejecutando
systemd-analyze verify FILE
.Compruebe los tiempos de ejecución de las entradas del calendario ejecutando
systemd-analyze calendar CALENDER_ENTRY
.
9.2 El evento no se activa #
Cuando activa un temporizador que contiene errores no críticos, systemd
los ignora de forma silenciosa. Por ejemplo:
systemd
que contiene un error no crítico #[Timer] OnBootSec=5min OnClendar=Mon..Fri 10:00 Unit=helloworld.service
La línea 3 contiene un error de sintaxis (OnClendar
en lugar de OnCalendar
). Dado que la sección [Timer]
contiene una segunda entrada de temporizador (OnBoot), el error no es crítico y se ignora silenciosamente. Como consecuencia, el activador de lunes a viernes no se ejecuta. La única forma de detectar el error es utilizar el comando systemd-analyze verify
:
#
systemd-analyze verify /etc/systemd/system/helloworld.timer
/etc/systemd/system/helloworld.timer:7: Unknown key name 'OnClendar' in section 'Timer', ignoring.
9.3 Comprobación de errores en el diario del sistema #
Como ocurre con todos los servicios de systemd
, los eventos y acciones activados por los temporizadores se registran en el diario del sistema. Si un activador no se comporta como se espera, compruebe los mensajes de registro con journalctl
. Para filtrar el diario y obtener información relevante, utilice el conmutador -u
para especificar los temporizadores systemd
y los archivos de servicio. Utilice esta opción para mostrar las entradas de registro para el temporizador y el archivo de servicio correspondiente:
sudo journalctl -u helloworld.timer -u helloworld.service
o más corto (si procede):
sudo journalctl -u helloworld.*
journalctl
es una herramienta que admite muchas opciones y filtros. Consulte man 1 journalctl
para obtener información detallada. Las siguientes opciones son útiles para solucionar problemas de temporizadores:
-b
: muestra solo las entradas del arranque actual.-S today
: muestra solo las entradas de hoy.-x
: muestra textos de ayuda junto a la entrada de registro.-f
: se inicia con las entradas más recientes e imprime continuamente el registro a medida que se añaden nuevas entradas. Es útil para comprobar los activadores que se producen en intervalos cortos. Para salir, pulse Control–C.
9.4 Temporizador systemd
: ponerse al día con las ejecuciones perdidas #
Si un temporizador systemd
estaba inactivo o el sistema estaba apagado durante el tiempo de ejecución previsto, los eventos perdidos se pueden activar inmediatamente cuando el temporizador se vuelva a activar. Para hacerlo, añada la opción de configuración Persistent=true
a la sección [Timer]
:
[Timer] OnCalendar=Mon..Fri 10:00 Persistent=true Unit=helloworld.service
9.5 ¿Cómo migrar de cron a temporizadores systemd
? #
Todos los trabajos cron se pueden migrar a temporizadores systemd
. A continuación encontrará instrucciones generales para migrar un trabajo cron:
Cree un archivo de servicio ejecutando el guion. Consulte el Ejemplo 1, “El archivo de servicio” para obtener más información.
Cree un archivo de temporizador ejecutando el archivo de servicio. Consulte el Ejemplo 2, “El archivo del temporizador” para ver las instrucciones generales.
Convierta las entradas de calendario. La hora se especifica de forma diferente en cron y en
systemd
. Utilice los patrones siguientes como plantilla de conversión:Cron: Minute Hour Day Month DayOfWeek systemd: OnCalendar=DayOfWeek Year-Month-Day Hour:Minute:Second
Para probar la entrada de calendario convertida, siga las instrucciones de la Sección 5, “Prueba de entradas de calendario”.
Convierta los apodos cron (
@NICK
):Cron :
systemd
timer -------- : ---------------------------- @reboot : OnBootSec=1s @yearly : OnCalendar=*-01-01 00:00:00 @annually: OnCalendar=*-01-01 00:00:00 @monthly : OnCalendar=*-*-01 00:00:00 @weekly : OnCalendar=Sun *-*-* 00:00:00 @daily : OnCalendar=*-*-* 00:00:00 @hourly : OnCalendar=*-*-* *:00:00Convierta las asignaciones de variables. La asignación de variable
systemd
debe ir a la sección[Service]
. No es posible convertirMAILTO
de esta forma; consulte el siguiente paso.cron: VARIABLE=VALUE systemd: Environment="VARIABLE=VALUE"
Configure las notificaciones por correo electrónico para reemplazar la función MAILTO de cron siguiendo las instrucciones de la Sección 6, “Recepción de notificaciones por correo electrónico cuando falla un temporizador”.
systemd
#
Estas son las entradas de crontab que llaman al guion helloworld.sh
5 minutos después del arranque y a las 10 en punto de cada lunes a viernes:
@reboot sleep 300 && /usr/local/bin/helloworld.sh 0 10 * * * 1-5 /usr/local/bin/helloworld.sh
El archivo de servicio systemd
(helloworld.service
) que llama al guion tiene este aspecto:
[Unit] Description="Hello World script" [Service] ExecStart=/usr/local/bin/helloworld.sh
El archivo del temporizador (helloworld.timer
) tiene este aspecto:
[Unit] Description="Run helloworld.service 5min after boot and at 10am every Mon-Fri" [Timer] OnBootSec=5min OnCalendar=Mon..Fri *-*-* 10:00:* Unit=helloworld.service [Install] WantedBy=multi-user.target
10 información adicional #
Para obtener una referencia completa sobre los temporizadores
systemd
, incluidas las opciones de configuración avanzadas (como retrasos o gestión de cambios de reloj o zona horaria), consulteman 5 systemd.timer
.
11 Información legal #
Copyright © 2006 –2024 SUSE LLC y colaboradores. Reservados todos los derechos.
Está permitido copiar, distribuir y modificar este documento según los términos de la licencia de documentación gratuita GNU, versión 1.2 o (según su criterio) versión 1.3. Este aviso de copyright y licencia deberán permanecer inalterados. En la sección titulada “GNU Free Documentation License” (Licencia de documentación gratuita GNU) se incluye una copia de la versión 1.2 de la licencia.
Para obtener información sobre las marcas comerciales de SUSE, consulte https://www.suse.com/company/legal/. Todas las marcas comerciales de otros fabricantes son propiedad de sus respectivas empresas. Los símbolos de marcas comerciales (®, ™, etc.) indican marcas comerciales de SUSE y sus filiales. Los asteriscos (*) indican marcas comerciales de otros fabricantes.
Toda la información recogida en esta publicación se ha compilado prestando toda la atención posible al más mínimo detalle. Sin embargo, esto no garantiza una precisión total. Ni SUSE LLC, ni sus filiales, ni los autores o traductores serán responsables de los posibles errores o las consecuencias que de ellos pudieran derivarse.