Start and stop one systemd unit with another

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:-

A.service

[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

B.service

[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

My answer:


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:

PartOf=
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.


View the full question and answer on Server Fault.

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.