Bug Killer asked:
I have two services A.service and B.service. I want B to be stopped when A exits/get killed/is stopped. Also, I want B to get restarted when A gets restarted. I tried out the answer given in
How to start and stop a systemd unit with another? and set my files up as follows:-
[Unit] Description=A Before=B.service Requires=B.service [Service] WorkingDirectory=/usr/sbin ExecStart=/usr/evo/evostart /usr/sbin/junosmagentd --app-name %p ExecStopPost=/usr/evo/exit_handler.sh %p Restart=always StartLimitBurst=3 StartLimitInterval=300
[Unit] Description=B BindsTo=A.service [Service] Type=forking ExecStart=/usr/share/B start ExecStop=/usr/share/B stop StartLimitBurst=5 StartLimitInterval=10 Restart=always
When I kill A or do a systemctl restart A, I see that B gets restarted. But when A exits with status 0, I don’t see B getting restarted. I have enabled systemd debug loggin and I see that the state of A changes to dead but not to auto-restart
Your B unit is using
BindsTo=, which is meant to track the state of a unit that may disappear.
What you want instead of this is
PartOf=, where this service will exactly track the status of the named service. From the documentation:
Configures dependencies similar to
Requires=, but limited to stopping and restarting of units. When systemd stops or restarts the units listed here, the action is propagated to this unit. Note that this is a one-way dependency — changes to this unit do not affect the listed units.
I don’t think this will fix all your problems, though. I suspect you haven’t carefully enough considered the actual dependencies between your two services, and will need to do some more thinking (and be able to express yourself) before you can make these units do what they need to do.
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.