Hi all,
I've stumbled upon something with systemd that I don't quite understand.
I'm trying to have service-A start when foo.target starts. Service-A pulls in 
service-B as well. That works well but I want service-B to stop with service-A, 
without setting PartOf or BindsTo for service-B.

Service-A uses BindTo foo.target and stops along with it. I'm trying to have 
service-B stop along with service-A using PropagatesStopTo=. My expectation is 
that it would cause service-B to stop when service-A is stopped, but that does 
not seem to be the case. Stopping foo.target stops service-A but service-B 
keeps running. I'm purposely not using BindTo from service-B because I want the 
service to be able to run independently in some cases..

Here's a working example of what I am trying to explain:

> #!/bin/bash
>
> cat > /etc/systemd/system/foo.target <<END
> [Unit]
> Description=Target
> END
>
> cat > /etc/systemd/system/service-A.service <<END
> [Unit]
> Description=Service A
> Wants=service-B.service
> BindsTo=foo.target
> PropagatesStopTo=service-B.service
>
> [Install]
> WantedBy=foo.target
> [Service]
> Type=oneshot
> RemainAfterExit=yes
> ExecStart=/bin/true
> END
>
> cat > /etc/systemd/system/service-B.service <<END
> [Unit]
> Description=Service A
> [Service]
> # Any service that "hangs" will do. I just want to test that systemd will 
> stop the process.
> ExecStart=nc -l 9000
> END
>
> systemctl stop service-A.service service-B.service foo.target
> systemctl daemon-reload
> systemctl enable service-A
>
> systemctl start foo.target
> # Service B is now running
> echo "service-B: " $(systemctl is-active service-B)
> systemctl stop foo.target
> # service-A is now stopped
> echo "service-A: " $(systemctl is-active service-A)
> # Expected the same for service-B because of StopPropagatesFrom but its still 
> running
> echo "service-B: " $(systemctl is-active service-B)

Have I misunderstood the use of PropagatesStopTo? Can I achieve my goal some 
other way?

Mvh. Sebastian from Denmark :)

Reply via email to