¿Iniciar el servicio systemd después de un servicio específico? [cerrado]

82

Tengo una pregunta general. ¿Cómo se inicia una unidad systemd *.servicedespués de que una en particular se *.servicehaya iniciado con éxito?

La pregunta más específica es, ¿cómo empiezo website.servicesolo después de que mongodb.serviceha comenzado? En otras palabras, website.servicedebería depender de mongodb.service.

jww
fuente
1
Esta pregunta pertenece a ServerFault, ¿no?
Rémi
1
@ Rémi ¡está bien en ambos sitios! :)
Pingüino anónimo
2
@AnonymousPenguin No, solo pasaron como 3.5 años antes de que respondieras, no es una pregunta sobre el tema para SO. No se trata de programar. SF o, mejor, Unix / Linux.SE sería mucho más apropiado.
underscore_d
Stack Overflow es un sitio para preguntas de programación y desarrollo. Esta pregunta parece estar fuera de tema porque no se trata de programación o desarrollo. Consulte ¿Qué temas puedo preguntar aquí en el Centro de ayuda? Quizás Super User o Unix & Linux Stack Exchange sería un mejor lugar para preguntar.
jww

Respuestas:

113

En el archivo .service en la sección [Unidad]:

[Unit]
Description=My Website
After=syslog.target network.target mongodb.service

La parte importante es la mongodb.service

La página de manual lo describe, sin embargo, debido al formato, no es tan claro a primera vista

systemd.unit - bien formateado

systemd.unit - no tan bien formateado

LW001
fuente
1
Nuestro servicio mongod inicia una base de datos muy grande. El servicio posterior no se inicia correctamente porque parece que mongo tarda más en cargar la base de datos después del inicio. Entonces, nuestro segundo servicio comienza pero falla porque mongo se inició exitosamente pero no cargó la base de datos. Quizás un retraso podría ayudar ...
wayofthefuture
¿Es posible que el servicio systemd maneje los siguientes escenarios? Considere múltiples servicios A, B, C, D. Si A existe, quiero que B, C, D comience solo después de A; de lo contrario, si A no existe, B, C, D pueden comenzar en cualquier orden. Por favor ayuda
aquiles
@achilles ¿Puede crear un servicio A falso en los sistemas donde no se necesita A? De esa manera, las dependencias de B, C, D se pueden mantener simples.
Walter A
49

After=La dependencia solo es efectiva cuando el servicio incluido After=y el servicio incluido por After=están programados para iniciarse como parte de su arranque.

Ex:

a.service
[Unit]
After=b.service

De esta manera, si ambos a.servicey b.serviceestán habilitados , systemd ordenará b.servicedespués a.service.

Si no lo entiendo mal, lo que está preguntando es cómo comenzar b.servicecuando a.servicecomienza aunque b.serviceno esté habilitado.

La directiva para esto es Wants=o Requires=menos [Unit].

website.service
[Unit]
Wants=mongodb.service
After=mongodb.service

La diferencia entre Wants=y Requires=es que con Requires=, si no se inicia b.service, el inicio de a.servicede fallará, mientras que con Wants=, a.servicese iniciará incluso si b.servicefalla. Esto se explica en detalle en la página de manual de.unit .

Umut
fuente
8
Creo que la verdad es exactamente lo contrario de esta respuesta. After=website.servicesignifica "ejecutar mi unidad después de website.service!". Eso es lo que se explica en los documentos: "Después = asegura que la unidad configurada se inicia después de que la unidad listada terminó de iniciarse" . Supongo que las "unidades enumeradas" son unidades en el lado derecho de "Después =".
Sindarus
"De esta manera, si tanto a.service como b.service están habilitados, systemd ordenará b.service después de a.service". ¿No te refieres al revés? swap(a, b)
Mateen Ulhaq