Cómo crear una unidad systemd compuesta

6

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?

Martin mucha
fuente

Respuestas:

10

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

  • all.target: Requires=one.service two.service three.service
  • one.service: PartOf=all.target
  • etc.

(Nuevamente, también debe declarar dependencias y pedidos entre los servicios; no confíe solo en que .target lo inicie todo).

Gravedad
fuente
1
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.

filbranden
fuente
1
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!
Martin Mucha