Ir al contenidoIr a la navegación de la página: página anterior [tecla de acceso p]/página siguiente [tecla de acceso n]
documentation.suse.com / Uso de los temporizadores systemd

Uso de los temporizadores systemd

Fecha de publicación: 29 Sep 2024
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 temporizadores systemd.

REQUISITOS

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 servicios systemd regulares, por lo que se pueden gestionar con systemctl.

  • 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

  1. 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 a systemd qué aplicación se debe ejecutar.

  2. 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.

  3. 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.

  4. Inicie el temporizador:

    > sudo systemctl start helloworld.timer

    Esto solo activa el temporizador para la sesión actual.

  5. Habilite el temporizador para asegurarse de que está activado al arrancar:

    > sudo systemctl enable helloworld.timer

2.2 Explicación del ejemplo

Ejemplo 1: El archivo de servicio
[Unit]
Description="Hello World script"1

[Service]
ExecStart=/usr/local/bin/helloworld.sh2

1

Una breve descripción de la finalidad del archivo de servicio.

2

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

Ejemplo 2: El archivo del temporizador
[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

1

Una breve descripción del propósito del archivo de temporizador.

2

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.

3

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.

4

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.

5

El archivo de servicio que se va a ejecutar.

6

El destino de systemd en el que se activa el temporizador. Para obtener más información sobre los destinos de systemd, consulte Managing systemd targets with systemctl.

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.timer
Ejemplo 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".7

1

El nombre y la descripción del archivo del temporizador.

2

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.

3

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).

4

La próxima fecha y hora a la se activa el temporizador.

5

Nombre del archivo de servicio que activa el temporizador.

6

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).

7

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 --allPATTERN

PATTERN debe ser un nombre o una expresión global de shell. Se pueden utilizar los operadores *, ? y []. Consulte man 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=STATE

STATE toma los siguientes valores: active, failed, load o sub. Consulte la man systemctl para obtener más información.

Ejemplo 4: Listado de temporizadores

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

1

El momento en el que se ejecutará el temporizador la próxima vez.

2

El tiempo que queda hasta la próxima ejecución del temporizador.

3

El momento en el que se ejecutó el temporizador por última vez.

4

El tiempo transcurrido desde la última ejecución del temporizador.

5

El nombre de la unidad de temporizador.

6

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

1

Día de la semana. Los valores posibles son Sun, Mon, Tue, Wed, Thu, Fri y Sat. Omita la opción para ignorar el día de la semana.

2

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.

3

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 unidad

    OnActiveSec=50minutes
  • OnBootSec: tiempo tras el arranque del sistema

    OnBootSec=10hours
  • OnStartupSec: tiempo desde que se inicia el gestor de servicios. Para los servicios del sistema, esto es casi igual a OnActiveSec. 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 correspondiente

    OnUnitActiveSec=10seconds
  • OnUnitInactiveSec: tiempo transcurrido desde la última desactivación del servicio correspondiente

    OnUnitInactiveSec=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.sh

Si el comando toma parámetros, añádalos separados por un espacio:

> sudo systemd-run --on-active="2hours" /usr/local/bin/helloworld.sh --language=pt_BR

Los 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:

  1. Cree un guion que envíe un mensaje de correo electrónico.

  2. Cree un archivo de servicio systemd que ejecute el guion de correo electrónico.

  3. Pruebe el archivo de servicio de correo electrónico.

  4. 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.

  1. Crear el guion /usr/local/bin/send_systemd_email.

    1. 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
    2. Asegúrese de que el guion sea ejecutable:

      > sudo chmod 755 /usr/local/bin/send_systemd_email
  2. 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).

  3. Verifique el archivo de servicio y solucione los problemas notificados:

    > systemd-analyze verify /etc/systemd/system/send_email_to_USER@.service

    Si el comando no devuelve ningún resultado, el archivo ha pasado la verificación correctamente.

  4. 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.service

    Si 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.

  5. Para añadir una notificación por correo electrónico al servicio, añada una opción OnFailure a la sección Unit 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

    1

    La opción OnFailure toma un servicio como argumento.

    2

    Sustituya la parte del nombre de archivo de la unidad de servicio por el nombre de inicio de sesión.

    3

    Especifica el nombre del servicio (en este ejemplo, helloworld). Este nombre está disponible en el archivo del servicio de correo electrónico como %i.

  6. Ha configurado correctamente la notificación de fallos para los servicios systemd.

Sugerencia
Sugerencia: envío de notificaciones por correo electrónico a varios usuarios

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 y journalctl 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
Importante
Importante: los temporizadores de usuario solo se ejecutan durante una sesión activa

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.

Importante
Importante: las variables de entorno no se heredan

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.

  1. Cree un archivo de servicio ejecutando el guion. Consulte el Ejemplo 1, “El archivo de servicio” para obtener más información.

  2. Cree un archivo de temporizador ejecutando el archivo de servicio. Consulte el Ejemplo 2, “El archivo del temporizador” para ver las instrucciones generales.

    1. 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”.

    2. 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:00
    3. Convierta las asignaciones de variables. La asignación de variable systemd debe ir a la sección [Service]. No es posible convertir MAILTO de esta forma; consulte el siguiente paso.

      cron: VARIABLE=VALUE
      systemd: Environment="VARIABLE=VALUE"
    4. 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”.

Ejemplo 6: Migración de cron a 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:

Ejemplo 7: Recorte del archivo del temporizador 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 ControlC.

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:

  1. Cree un archivo de servicio ejecutando el guion. Consulte el Ejemplo 1, “El archivo de servicio” para obtener más información.

  2. Cree un archivo de temporizador ejecutando el archivo de servicio. Consulte el Ejemplo 2, “El archivo del temporizador” para ver las instrucciones generales.

    1. 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”.

    2. 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:00
    3. Convierta las asignaciones de variables. La asignación de variable systemd debe ir a la sección [Service]. No es posible convertir MAILTO de esta forma; consulte el siguiente paso.

      cron: VARIABLE=VALUE
      systemd: Environment="VARIABLE=VALUE"
    4. 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”.

Ejemplo 8: Migración de cron a 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