
He notado una variación significativa en el enfoque en alguna documentación de systemd y documentos de instrucciones sobre cómo configurar uno o más servicios para usar el mismo temporizador.
Hasta donde he podido reconstruir (aunque puede que me equivoque), esto describiría lo queBuscado poryUnidadLos parámetros en un archivo de servicio y temporizador deben configurarse (sin usar ejemplos de código reales aquí, para reducir la longitud de la publicación) para un solo servicio y, a la inversa, una configuración de múltiples servicios usando un solo temporizador:
Temporizador para un solo servicio
My.Service1 'WantedBy' Param: N/A (1)
My.Timer 'Unit' Param: My.Service1 (2)
My.Timer 'WantedBy' Param: MultiUser/Basic.Target (3)
(1)El archivo de servicio no necesita una sección [Instalar] con un parámetro WantedBy.
(2)En la sección [Temporizador] del temporizador, el parámetro Unidad debe apuntar al archivo de servicio My.Service1.
(3)El archivo del temporizador tiene un parámetro WantedBy que apunta a algún objetivo especial del sistema que se utilizará para iniciarlo.
Temporizador para múltiples servicios.
My.Service1 'WantedBy' Param: Timer.Target (1)
My.Service2 'WantedBy' Param: Timer.Target (1)
My.Service3 'WantedBy' Param: Timer.Target (1)
Timer 'Unit' Param: Timer.Target (2)
Timer 'WantedBy' Param: ???
(1)Todos los servicios deben conectarse al mismo destino definido mediante el parámetro WantedBy.
(2)El parámetro Unidad [Temporizador] también debe apuntar al objetivo.
Para ver un ejemplo de la última configuración, consulteeste instructivo. Lo contaré como Ejemplo 1. Sin embargo, he encontrado otros ejemplos prácticos que se desvían de esto (ver más abajo).
Ejemplo 2yEjemplo 3decir que debería configurarse así:
My.Service1 WantedBy: Timer.Target
My.Service2 WantedBy: Timer.Target
My.Service3 WantedBy: Timer.Target
Timer 'Unit' Param: My.Service1 (1)
Timer 'WantedBy' Param: MultiUser/Basic.Target
(1) Esto tiene que ser un descuido en la documentación porque si deja la unidad apuntando solo a uno de sus múltiples servicios, los otros servicios no pueden usar el temporizador. Posiblemente esto se debió al enfoque "ver arriba" utilizado allí para remitir al lector a la configuración de servicio único sin mencionar realmente (lo que es importante) lo que era necesario cambiar.
Luego conEjemplo 4Su configuración parece que realmente funcionará, pero conecta los servicios con el objetivo de una manera diferente creando los archivos de servicio directamente bajo el/etc/systemd/system/Timer.Target.wants/subdirectorio y excluye cualquier parámetro WantedBy en los archivos de servicio. De este modo:
My.Service1 'WantedBy' Param: N/A
My.Service2 'WantedBy' Param: N/A
My.Service3 'WantedBy' Param: N/A
Timer 'Unit' Param: Timer.Target
Timer 'WantedBy' Param: MultiUser/Basic.Target
Un enfoque híbrido entre los ejemplos 1 y 4 que he visto es crear los archivos de servicio en el/etc/systemd/sistema/directorio (la ubicación predeterminada) y crear un enlace simbólico a esos archivos de servicio en el/etc/systemd/system/Timer.Target.wantsarchivo yexcluirun parámetro WantedBy en el archivo de servicio (que es funcionalmente equivalente al Ejemplo 4), mientras que otra configuración utiliza el método de enlace simbólico pero además incluye el parámetro WantedBy en el archivo de servicio (que parece redundante e innecesario).
Sin embargo, mi pregunta sería la siguiente para el Ejemplo 4 y los enfoques híbridos: ¿Por qué poner algo bajo un*.quieredirectorio será necesario si se supone que declarar un parámetro WantedBy le indica a systemd que lo haga por usted (como se indica en la explicación de ese parámetro enesta página)?
¿Alguien puede arrojar luz sobre la mejor manera de configurar múltiples servicios usando el mismo temporizador en medio de la confusa multiplicidad de enfoques para hacer esto?
Respuesta1
Si desea activar varios servicios con un solo temporizador, inserte un objetivo en el medio:
La unidad del temporizador, llamémosla foo.timer
:
[Unit]
Description=My timer that runs saturdays, 9am and triggers foo.target
Wants=foo.target
[Timer]
OnCalendar=Sat 9:00
Unit=foo.target
[Install]
WantedBy=timers.target
La unidad objetivo, llamémosla foo.target
:
[Unit]
Description=My target unit, that groups my two services xxx.service and yyy.service
Wants=xxx.service yyy.service
After=xxx.service yyy.service
[Install]
Also=foo.timer
Y luego los dos servicios xxx.service
y yyy.service
:
[Unit]
Description=My service XXX
[Service]
ExecStart=/bin/echo I am XXX
[Install]
Also=foo.timer
[Unit]
Description=My service YYY
[Service]
ExecStart=/bin/echo I am YYYY
[Install]
Also=foo.timer
Copie estos cuatro archivos unitarios ( foo.timer
, foo.target
, xxx.service
, yyy.service
) en /etc/systemd/systemd/
. Luego habilite e inicie el temporizador ejecutando:
systemctl enable --now foo.timer`
Eso se conectará foo.timer
a timers.target
, que es el objetivo genérico que se supone que activa todos los temporizadores definidos en un sistema.
Tenga en cuenta que también podría hacerlo systemctl enable foo.target
, por cierto, y también systemctl enable zzz.service
, ya que las Also=
líneas en esas unidades propagan las solicitudes de habilitación hacia foo.timer
.
Respuesta2
Un temporizador systemd siempre activa una unidad.
Si desea activar dos unidades en el mismo horario, le recomiendo crear dos archivos de temporizador para mayor claridad que contengan el mismo horario.
De lo contrario, puede crear un archivo de "unidad de servicio" que inicie los dos servicios que desee.
No creo que "WantedBy=" sea un concepto particularmente útil para unidades de temporizador.