Ahí tengo ciertos servicios, que normalmente empiezo juntos: digamos zookeeper + kafka + elassandra. ¿Hay alguna manera de escribir unidades compuestas: todo comienza junto, todos mueren juntos? Es decir, si comienzo esto, delegará para comenzar todo eso, y viceversa. ¿Cuál sería la forma correcta de hacer eso?
Una forma es hacer que los tres servicios dependan de los dos restantes Requires=.
one.service: Requires=two.service three.service
dos.servicio: Requires=one.service three.service
tres.servicio: etc.
Esto no creará un bucle: las dependencias son independientes del pedido de inicio.
(Dicho esto, debe declarar algunos Before = o After =, por ejemplo, si kafka necesita correr después del cuidador del zoológico).
El otro método es crear una unidad .target, hacer que dependa de sus tres servicios y que los servicios sean PartOf=la unidad. (Desafortunadamente, todavía no es posible tener ConsistsOf = en el .target mismo).
muchas gracias, me gusta en primer enfoque, que puedo comenzar cualquiera de estos servicios y todos aparecerán en el orden correcto. Y el segundo será útil para los servicios de arranque múltiple, que no necesitan iniciarse siempre juntos. Gracias por ambos, los usaré, ambos.
Martin Mucha
4
Sí, hay algunas maneras de lograr eso.
La más simple (que hace algo de lo que usted describe, pero no todo) es crear una unidad objetivo y agregar dependencias en sus unidades de servicio (por ejemplo, Requires=zookeeper.service kafka.service elassandra.servicey también establecerlas After=en las mismas unidades). Una unidad objetivo es útil para comenzar todo estas unidades juntas, pero en realidad no ayuda a detenerlas todas juntas (usar systemctl stopen la unidad objetivo no detendrá sus dependencias). Hay formas en que puede detener unidades, por ejemplo systemctl isolate multi-user.target, detendrá todas las unidades que no son dependencias de esa unidad. objetivo, lo que significa que las unidades iniciadas manualmente se detendrán, pero esto es mucho más fuerte que detener un pequeño conjunto de unidades, por lo que probablemente no sea un gran ajuste ...
Quizás un mejor enfoque sea usar la PartOf=directiva , que hace exactamente lo que usted describe. Puede crear una unidad de servicio "ficticia" para administrar todos los servicios juntos, o elegir uno de sus servicios y hacer que los demás sean PartOfese único servicio.
PartOf=Debe configurar en todas las unidades que desea iniciar y detener juntos, en su caso, zookeeper.service, kafka.service y elassandra.service. Pero tenga en cuenta que no necesariamente necesita modificar los archivos de la unidad de servicio (por ejemplo, si se envían con el software en paquetes deb o rpm). Puede usar archivos de anulación (que puede crear usando systemctl edit) para agregar un pequeño fragmento de configuración a una unidad existente, que debería facilitarle la definición de PartOf=relaciones entre unidades, incluso si están definidas en archivos que preferiría no modificar.
No hay necesidad Afteren el objetivo. La arquitectura es irregular aquí.
JdeBP
1
gracias por su respuesta también, es decir, para anulaciones de unidades, no sabía sobre eso. ¡Gracias! Es una pena que solo pueda marcar una respuesta válida. ¡Gracias de nuevo!
Sí, hay algunas maneras de lograr eso.
La más simple (que hace algo de lo que usted describe, pero no todo) es crear una unidad objetivo y agregar dependencias en sus unidades de servicio (por ejemplo,
Requires=zookeeper.service kafka.service elassandra.service
y también establecerlasAfter=
en las mismas unidades). Una unidad objetivo es útil para comenzar todo estas unidades juntas, pero en realidad no ayuda a detenerlas todas juntas (usarsystemctl stop
en la unidad objetivo no detendrá sus dependencias). Hay formas en que puede detener unidades, por ejemplosystemctl isolate multi-user.target
, detendrá todas las unidades que no son dependencias de esa unidad. objetivo, lo que significa que las unidades iniciadas manualmente se detendrán, pero esto es mucho más fuerte que detener un pequeño conjunto de unidades, por lo que probablemente no sea un gran ajuste ...Quizás un mejor enfoque sea usar la
PartOf=
directiva , que hace exactamente lo que usted describe. Puede crear una unidad de servicio "ficticia" para administrar todos los servicios juntos, o elegir uno de sus servicios y hacer que los demás seanPartOf
ese único servicio.PartOf=
Debe configurar en todas las unidades que desea iniciar y detener juntos, en su caso, zookeeper.service, kafka.service y elassandra.service. Pero tenga en cuenta que no necesariamente necesita modificar los archivos de la unidad de servicio (por ejemplo, si se envían con el software en paquetes deb o rpm). Puede usar archivos de anulación (que puede crear usandosystemctl edit
) para agregar un pequeño fragmento de configuración a una unidad existente, que debería facilitarle la definición dePartOf=
relaciones entre unidades, incluso si están definidas en archivos que preferiría no modificar.fuente
After
en el objetivo. La arquitectura es irregular aquí.