Cómo programar tareas con temporizadores de Systemd en Linux

Cómo programar tareas con temporizadores de Systemd en Linux

La forma tradicional de programar tareas en Linux es usar el cron demonio, especificando intervalos de tiempo y
comandos para ser ejecutados en crontabs.

Systemd, el sistema init relativamente nuevo ahora adoptado por todas las principales distribuciones de Linux, entre las otras cosas, proporciona la capacidad de programar tareas utilizando unidades, llamado temporizadores. En este artículo aprenderemos cómo están estructurados y algunos ejemplos de su uso.

En este tutorial aprenderás:

  • La estructura básica de los temporizadores Systemd;
  • Cómo crear temporizadores monotónicos y en tiempo real;
  • Cómo enumerar e inspeccionar temporizadores activos;
  • Cómo habilitar temporizadores;
  • Cómo usar temporizadores transitorios;


Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Independiente de la distribución
Software System
Otro Conocimiento de conceptos básicos de Systemd
Convenciones # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
ps - Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado

Uso básico



Programar una tarea a través de Systemd implica el uso de dos tipos de unidades diferentes: temporizadores y servicios. Los primeros son archivos unitarios con el .Temporizador Extensión: en ellos, definimos el horario de trabajo y establecemos la unidad de servicio que debe activarse. Estos últimos son los tipos de unidades más comunes: se utilizan para definir los servicios en las distribuciones modernas de Linux y son identificados por el .servicio extensión.

Utilizamos unidades de servicio para establecer el comando real que se ejecutará (si no está familiarizado con los conceptos básicos de SystemD, es posible que desee echar un vistazo a nuestro artículo sobre Systemd Services).

Dependiendo de cómo se cree el horario, un temporizador puede ser:

  1. Monótono
  2. Tiempo real

Temporizadores monotónicos

Systemd proporciona una lista de palabras clave que podemos usar en una unidad de temporizador para programar la ejecución de una tarea una cierta cantidad de tiempo después de un evento predefinido. Las palabras clave deben usarse en el [Temporizador] Sección de la unidad de temporizador.

Vamos a verlos y explicar su significado:



Palabra clave Significado
Onactiva Programe la tarea en relativa al momento en que se activa la unidad de temporizador en sí misma
Oncootsec Programe tarea en relativa al tiempo de arranque del sistema
OnStartUpsec Programe la tarea relativamente al momento en que Systemd comenzó
Onunitactivesec Programe la tarea relativamente a la última vez que la unidad de servicio estuvo activa
Onunitinactivives Programe la tarea relativamente a la última vez que la unidad de servicio estaba inactiva

Como se puede adivinar fácilmente del nombre de las teclas, los "segundos" se usan como la unidad de tiempo predeterminada. Sin embargo, podemos especificar una unidad diferente después del valor (e.gramo. 15m - quince minutos). Como veremos más adelante, las palabras clave se pueden combinar dentro de una unidad de temporizador.

Temporizantes en tiempo real

También se puede programar un evento en términos "absolutos", de manera similar a cómo lo definiríamos a través de Cron, usando otro Oncalendario Palabra clave y codificaciones de tiempo permitidas.

Aquí hay unos ejemplos:



Especificación de tiempo Explicación
Miércoles 18:00:00 La tarea se ejecutará todos los miércoles a las 18:00
Mon ... mié *-5-27 La tarea se ejecutará el 27 de mayo de cada año, pero solo en días de lunes a miércoles
2020-05-27 La tarea se ejecutará el 27 de mayo del año 2020 a las 00:00:00
Jueves, viernes 2020-*-1,5 11:12:13 La tarea se ejecutará a las 11:12:13 del primer y quinto día de cada mes del año 2020, pero solo si el día es un jueves o viernes
*: 0/2 La tarea se ejecutará cada dos minutos a partir del minuto 0
15/2 La tarea se ejecutará cada dos horas a partir de las 3:00 p.m
cada hora La tarea se ejecutará al comienzo de cada hora
a diario La tarea se ejecutará todos los días a las 00:00:00
semanalmente La tarea se ejecutará todos los lunes a las 00:00:00
mensual La tarea se ejecutará el primer día de cada mes a las 00:00:00

Los días de semana, si se especifican, deben estar en inglés, ya sea en forma abreviada (miércoles) o completa (miércoles) (el caso no importa).

Podemos proporcionar una lista de valores de tiempo utilizando el , personaje y especifique un rango de valores utilizando . A * El personaje coincide con cualquier valor. Se pueden encontrar más ejemplos consultando el system.tiempo manera.

Listado de temporizadores activos

Para enumerar todo el activo unidades de temporizador En nuestro sistema, podemos lanzar el Timers de lista subcomando de systemctl. A menos que el --todo La opción se pasa al comando, solo los temporizadores activos se incluyen en el resultado. Aquí hay un ejemplo de la salida producida por el comando:

$ SystemCtl List Timers PRÓXIMO IZQUIERDA ÚLTIMO APROBADO UNIDAD Activado Sol 2020-01-19 19:36:06 CET 5H 15 minutos Izquierda Sábado 2020-01-18 10:38:59 CET 1 día 3H Systemd-tmpfiles-Clean.temporizador systemd-tmpfiles-limpio.Servicio lun 2020-01-20 00:00:00 CET 9H Left Sol 2020-01-19 00:00:16 CET 14H Hace Man-DB.temporizador man-db.servicio lun 2020-01-20 00:00:00 CET 9H Left Sol 2020-01-19 00:00:16 CET 14H SOWAS.sombra del temporizador.servicio 

El informe es muy detallado. Incluye 6 columnas, que describen, en orden:

  1. La próxima vez que se ejecute el temporizador (PRÓXIMO);
  2. Cuántas veces antes de la próxima vez se volverá a funcionar (IZQUIERDA);
  3. La última vez que corrió el temporizador (ÚLTIMO);
  4. ¿Cuántas veces han pasado desde la última vez que corrió el temporizador (APROBADO);
  5. El unidad de temporizador en el que se establece el horario (UNIDAD);
  6. El unidad de servicio activado por el temporizador (Activado).


Un ejemplo del mundo real

Examinemos el hombre-DB.Temporizador Temporizador. Para inspeccionar la unidad, podemos usar SystemCTL y el gato subcomando:

$ SystemCtl Cat Man-DB.Temporizador

Aquí está la definición del temporizador:

[Unidad] Descripción = Documentación de regeneración diaria del hombre-DB = hombre: Mandb (8) [Temporizante] Oncalendar = Daily AccureCySec = 12H persistente = True [Install] Wantedby = Timers.objetivo 

Lo primero que podemos notar es el [Unidad] estrofa, que es común a todos los tipos de unidades Systemd. Aquí se utiliza para proporcionar una descripción de la unidad: podemos ver que el temporizador se utiliza para realizar una "regeneración diaria de Man-DB".

La sección que más nos interesa es, sin embargo, es [Temporizador]. Esta estrofa es específica de las unidades de temporizador: es donde se define el horario. El Oncalendario La palabra clave se usa para establecer un a diario Horario de tiempo real.

También podemos observar otras dos palabras clave: Precuracysec y Persistente. El primero se utiliza para establecer un retraso máximo en el que se puede lanzar el servicio. En este caso el valor es 12h, Entonces, el comando podría retrasarse durante un máximo de 12 horas. El valor predeterminado para Precuracysec es 1 minuto; La mejor precisión se obtiene con el 1NS notación (1 nanosegundo).



La otra palabra clave, Persistente, toma un valor booleano: si se establece en verdadero, la última vez que el servicio fue activado por el temporizador se guarda en el disco. Si por alguna razón se pierde una ejecución programada, la próxima vez que se activa la unidad del temporizador, el servicio se lanza de inmediato, si en el tiempo transcurrido se habría activado al menos una vez. Esto puede ser útil, por ejemplo, para ejecutar los horarios perdidos debido a un sistema alimentado, la próxima vez que la máquina esté alimentada.

Al observar más de cerca la definición del temporizador, podemos notar que el servicio que se activará no se menciona explícitamente: cuando esto sucede, Systemd busca una unidad de servicio con el mismo nombre del temporizador (en este caso, en este caso hombre-DB.servicio). Para hacer referencia a una unidad de servicio explícitamente, debemos usar el Unidad palabra clave.

Activar un temporizador

Activar un temporizador es bastante simple. Todo lo que tenemos que hacer es colocarlo, junto con el servicio, debe activar, dentro del /etc/systemd/sistema directorio. Con todos los archivos en su lugar, ejecutamos:

$ sudo systemctl inicio .Temporizador

Para que un temporizador se active automáticamente en el arranque (o cuando se alcanza otro objetivo específico), todo lo que tenemos que hacer es asegurarnos de que tenga un [Instalar] estrofa, donde especificamos cuándo debe ocurrir la activación.

En el ejemplo de arriba el Buscado por La palabra clave se utiliza para establecer una dependencia inversa (débil) de una unidad objetivo específica (temporizadores.objetivo - Un objetivo alcanzado bastante temprano en el proceso de arranque) en la unidad de temporizador que estamos configurando: antes de que se alcance ese objetivo, nuestra unidad debe activarse.

Temporizadores transitorios

Es posible programar la ejecución de tareas "sobre la marcha", sin crear manualmente un temporizador dedicado y unidades de servicio utilizando corriendo. El comando crea unidades temporales (no sobrevivirán a un reinicio) dentro del /run/systemd/transitorio directorio si se ejecuta a nivel mundial y dentro /run/user // Systemd/Transient directorio si se lanza como un usuario específico (--usuario opción).

Veamos un ejemplo. Supongamos que queremos que la fecha y la hora se registren en un archivo cada minuto. Corríamos:

$ systemd-run --user --on-calendar '*: 0/1'/bin/sh -c "fecha >> ~/log.txt "Ejecutar el temporizador como unidad: Run-R81A4FEF38154401BBD8CDBD1E5C19D04.El temporizador ejecutará el servicio como unidad: Run-R81A4FEF38154401BBD8CDBD1E5C19D04.servicio 

Como podemos ver en la salida del comando, se han creado dos unidades temporales, Run-R81A4FEF38154401BBD8CDBD1E5C19D04.Temporizador y Run-R81A4FEF38154401BBD8CDBD1E5C19D04.servicio.

Si examinamos el archivo de registro, podemos ver que el temporizador funciona correctamente:

$ Cat ~/Log.txt lun 20 de enero 2020 11:20:54 AM CET Lun 20 de enero 2020 11:21:54 AM CET LUN 20 JAN 2020 11:22:54 AM CET LUN 20 DE JAN2220 11:23:54 AM CET LUN 20 JAN20 11 11 : 24: 54 AM CET lun 20 de enero de 2020 11:25:54 AM CET Lun 20 de enero 2020 11:26:54 AM CET 

Para eliminar/deshabilitar un temporizador transitorio, Todo lo que tenemos que hacer es detenerlo. En este caso correríamos:

$ SystemCTL --User Stop Run-R81A4FEF38154401BBD8CDBD1E5C19D04.Temporizador

Conclusiones

En este tutorial aprendimos cómo podemos programar tareas del sistema utilizando los temporizadores de Systemd como alternativa a Cronjobs. Vimos las estructuras básicas detrás de los temporizadores, cómo podemos definir horarios monotónicos y en tiempo real a través de palabras clave dedicadas, como Oncootsec o Oncalendario, Cómo enumerar y examinar los temporizadores activos, cómo habilitarlos y deshabilitarlos.

Finalmente, vimos cómo usar temporizadores transitorios. En este artículo debe encontrar todo lo que necesita para comenzar con los temporizadores. Sin embargo, para obtener información más detallada, puede echar un vistazo a la documentación oficial, ya sea en línea o consultando el system.Temporizador manera.

Tutoriales de Linux relacionados:

  • Cosas para instalar en Ubuntu 20.04
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Cómo crear un trabajo cron en Kubernetes
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Cosas que hacer después de instalar Ubuntu 22.04 Jellyfish de Jammy ..
  • Descarga de Linux
  • Cómo ejecutar comandos periódicamente con Anacron en Linux
  • Archivos de configuración de Linux: los 30 principales más importantes
  • Ubuntu 20.04 trucos y cosas que quizás no sepas