Me gustaría saber si hay una manera Systemd
de reiniciar A.service
( After
) cuando B.service
se inicia o se vuelve a cargar (solo recargar la configuración), si es posible sin editar el sistema B.service
que instala y actualiza.
A.service
debe comenzar 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
Overriding vendor settings
pero esto parece aún más fácil y prometedor, solo la excitación es que no quieroA
parar si meB
detengo, soloA.restart
siB.start
, de todos modos, haré alguna prueba pronto y veré si hay alguna forma de manejarlo, entonces te lo haré saberPartOf
yRestart=always
juntos?Restart=
documentación, no estoy seguro de cuál es el comportamiento con losoneshot
servicios, pero de todos modos:When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restarted
si entiendo correctamente, detener manualmente B detendría APartOf
no es una solución para la pregunta, disfrute de todos modos.PartOf
conRestart=always
? ¿Intentaste eso?No tenía control sobre
stop
conPartOf=
, yA
no debe parar conB
, por lo que terminé usando la configuración de proveedores Anulación , parece que funciona./etc/systemd/system/B.service.d/override.conf
/cmd
la implementación es asíncrona y accedo a un recurso que también/script.sh
necesita acceder, no encontré nada mejor (por ahora) para dormir unos segundos.Traté de usar
systemctl [--no-block] try-restart
antes de usar/script.sh
directamente pero no funcionó.fuente
man systemd.unit
(o búscalo en línea si no está instalado) y busca el capítulo "Anulación de la configuración del proveedor".Por el momento, systemd no cubre este senario. No puede lograr esta funcionalidad solo a través de los archivos de servicio. Una posibilidad es secuestrar systemctl a través de un script de shell con el mismo nombre y en esa verificación para ver si B.service está a punto de reiniciarse o recargarse, realizar la acción apropiada con A.service también y, si es necesario, actualizar 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:
Obviamente, esto no sería efectivo si systemd manipula internamente B.service (por ejemplo, a través de otros archivos de servicio).
fuente