Cómo programar tareas con temporizadores de Systemd en Linux
- 1729
- 301
- Mario Gollum
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
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 dominiops - 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:
- Monótono
- 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:
- La próxima vez que se ejecute el temporizador (PRÓXIMO);
- Cuántas veces antes de la próxima vez se volverá a funcionar (IZQUIERDA);
- La última vez que corrió el temporizador (ÚLTIMO);
- ¿Cuántas veces han pasado desde la última vez que corrió el temporizador (APROBADO);
- El
unidad de temporizador
en el que se establece el horario (UNIDAD); - 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
- « E no se puede localizar el paquete error de instalación de paquetes apt
- Instalar el anillo, una alternativa Foss VoIP Skype »