linux - tag - musica brainz picard
Cómo reiniciar un servicio si se reinicia su servicio dependiente (3)
Creo que la opción necesaria es BindsTo, que también maneja los malos comportamientos.
[Unit]
Requires=postgresql.service
After=postgresql.service
BindsTo=postgresql.service
BindsTo =
Configura dependencias de requisitos, muy similares en estilo a las requeridas =. Sin embargo, este tipo de dependencia es más fuerte: además del efecto de Requiere =, declara que si la unidad vinculada está detenida, esta unidad también se detendrá. Esto significa que una unidad vinculada a otra unidad que de repente entra en estado inactivo también se detendrá. Las unidades pueden entrar repentinamente, inesperadamente, al estado inactivo por diferentes motivos: el proceso principal de una unidad de servicio puede finalizar por su propia elección, el dispositivo de respaldo de una unidad de dispositivo puede estar desenchufado o el punto de montaje de una unidad de montaje puede desmontarse sin la participación de El administrador de sistemas y servicios.
Cuando se usa junto con After = en la misma unidad, el comportamiento de BindsTo = es aún más fuerte. En este caso, la unidad obligada a estar estrictamente debe estar en estado activo para que esta unidad también esté en estado activo. Esto no solo significa que una unidad vinculada a otra unidad que repentinamente entra en estado inactivo, sino también una que está vinculada a otra unidad que se omite debido a una verificación de condición fallida (como ConditionPathExists =, ConditionPathIsSymbolicLink =, ... ver más abajo) será Se detuvo, debería estar funcionando. Por lo tanto, en muchos casos es mejor combinar BindsTo = con After =.
Un servicio (por ejemplo, bar.service) depende de otro servicio (por ejemplo, foo.service), como a continuación
archivo de servicio de bar:
[Unit]
After=foo.service
Requires=foo.service
...
Si se reinicia foo.service (ya sea manualmente o debido a un error), ¿cómo se puede reiniciar automáticamente el servicio de barra también?
Otra solución podría ser utilizar la opción ExecStartPost para reiniciar el servicio bar.si (si se ejecuta) cuando foo.service haya comenzado (re) nuevamente:
# foo.service
[Service]
ExecStartPost=/bin/systemctl try-restart bar.service
Restart=on-failure
RestartSec=30s
Las opciones adicionales Restart y RestartSec aseguran que foo.service se reiniciará automáticamente al bloquearse y, por lo tanto, también bar.service.
Una segunda extensión es agregar el mismo a bar.service y asegurarse de que bar.service comience después de foo.service:
# bar.service
[Unit]
After=foo.service
[Service]
Restart=on-failure
RestartSec=30s
Esto debería iniciar ambos servicios automáticamente en caso de un bloqueo y el servicio bar.s se reiniciará cuando foo.service se reinicie (debido a un error o se active manualmente).
Puedes usar PartOf
.
[Unit]
After=foo.service
Requires=foo.service
PartOf=foo.service
Desde la página del manual de systemd.unit
:
PartOf =
Configura dependencias similares a las requeridas =, pero limitadas a detener y reiniciar unidades. Cuando systemd detiene o reinicia las unidades enumeradas aquí, la acción se propaga a esta unidad. Tenga en cuenta que esta es una dependencia de un solo sentido: los cambios en esta unidad no afectan a las unidades enumeradas.