El service de la unidad del sistema se reinicia si otro service se inicia o recarga

Me gustaría saber si hay una forma con Systemd para reiniciar A.service ( After ) cuando B.service se inicia o recarga (solo recarga de configuration), si es posible sin editar B.service que está instalado y actualizado por el sistema.

A.service debe iniciarse incluso si B.service no está instalado, deshabilitado o detenido.

A.service :

 [Unit] After = B.service network-online.target Wants = B.service [Service] Type=oneshot ExecStart = /script.sh start ExecStop = /script.sh stop RemainAfterExit=yes [Install] WantedBy = network-online.target 

B.service :

 [Unit] After=syslog.target network.target [Service] Type=forking ExecStart=/cmd start ExecStop=/cmd stop ExecReload=/cmd reload PIDFile=/var/run/cmd.pid [Install] WantedBy=multi-user.target 

Related of "El service de la unidad del sistema se reinicia si otro service se inicia o recarga"

Puede usar PartOf en la sección [Unit] .

Ejemplo: PartOf=B.service

De la página del hombre,

PartOf =

Configura dependencies similares a Requires =, 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 count que esta es una dependencia de un solo sentido: los cambios en esta unidad no afectan a las unidades enumeradas.

Por el momento systemd no cubre este senario. No puede lograr esta funcionalidad solo a través de files de service. Una posibilidad es secuestrar systemctl mediante un script de shell con el mismo nombre y en esa comprobación para ver si B.service está a punto de reiniciarse o recargarse, realice la acción adecuada con A.service también y, si es necesario, actualice el rc.local para llegar al estado correcto en el arranque también. Tengo este problema con docker.service y networking.service, pero siempre los reinicio juntos:

systemctl restart docker.service networking.service

Obviamente, esto no sería efectivo si el sistema mismo manipula internamente B.service (por ejemplo, a través de otros files de service).

No tenía control sobre la stop con PartOf= , y A no debe detenerse con B , por lo que terminé usando la configuration de proveedor superior, parece que funciona.

/etc/systemd/system/B.service.d/override.conf

 [Service] ExecStart= ExecStart=/bin/sh -c '/cmd start || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0' ExecReload= ExecReload=/bin/sh -c '/cmd reload || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0' 

/cmd implementación de /cmd es asincrónica y /script.sh un recurso al que /script.sh necesita acceder también, no encontré nada mejor (por ahora) para dormir unos segundos.

Intenté usar systemctl [--no-block] try-restart antes de usar /script.sh directamente pero no funcionó.