How to synchronize systemd stop order from one service?

How to synchronize systemd stop order from one service?



Suppose I have a.service which I cannot modify, and b.service which I can modify, I want to see this stop order:


a.service


b.service


Stopping b.service ...
Stopped b.service
Stopping a.service ...
Stopped a.service



instead of this:


Stopping b.service ...
Stopping a.service ...
Stopped b.service
Stopped a.service



Assume that b.service may take at least 20 seconds to finish.


b.service





Related - serverfault.com/questions/785127/….
– slm
Sep 3 at 21:52




2 Answers
2



In order to stop b.service before a.service, you need to actually order b.service after a.service, since the ordering at service stop time is the inverse of the order at start time.


b.service


a.service


b.service


a.service



So this should be enough to accomplish what you described:



See the documentation for After= in man systemd.unit, which states:


After=


man systemd.unit



Note that when two units with an ordering dependency between them are shut down, the inverse of the start-up order is applied. i.e. if a unit is configured with After= on another unit, the former is stopped before the latter if both are shut down.


After=



You also asked about what happens if b.service takes at least 20 seconds to terminate. That is fine. If b.service is properly configured so systemd is able to monitor it until unit stop is completed (in other words, if ExecStop= is not somehow misconfigured) and if it stops before the timeout is reached (see TimeoutStopSec=), then systemd will wait until b.service is fully stopped before initializing shutdown of a.service.


b.service


b.service


ExecStop=


TimeoutStopSec=


b.service


a.service





Oh I think I got confused because I saw Stopped Qubes DB agent.(as a.service) right after Stopped Qubes Dom0 startup setup(as b.service) and I assumed there should've been a Stopping Qubes DB agent... inbetween, but there wasn't because Qubes DB agent service is lacking any ExecStop= lines! So I thought the Stopping of a.service happened earlier than the Stopped for b.service which I took to mean that it didn't wait for b.service to fully stop before trying to stop a.service. But I was wrong. Thank you for your great answer!
– Marcus Linsner
Sep 3 at 21:54


Stopped Qubes DB agent.


a.service


Stopped Qubes Dom0 startup setup


b.service


Stopping Qubes DB agent...


Qubes DB agent


ExecStop=


Stopping


a.service


Stopped


b.service


b.service


a.service





Looks like it sometimes doesn't work, or there's something else happening. I tried 3 consecutive boots since I added dev-block-253:0.device to my After= in qubes-core.service (and did a sudo systemctl daemon-reload of course) and the 3rd boot acted as if I hadn't added that so the order wasn't respected! all details here: gist.github.com/constantoverride/… (where qubes-core.service is just a page scroll above). I must be missing something, or is it a systemd bug?
– Marcus Linsner
Sep 4 at 1:52


dev-block-253:0.device


After=


qubes-core.service


sudo systemctl daemon-reload


qubes-core.service



If you merely want to stop these in a given order you can invoke the call to systemctl like this:


systemctl


$ systemctl stop a.service && systemctl stop b.service



or


$ systemctl stop a.service; systemctl stop b.service



Thanks for contributing an answer to Unix & Linux Stack Exchange!



But avoid



To learn more, see our tips on writing great answers.



Some of your past answers have not been well-received, and you're in danger of being blocked from answering.



Please pay close attention to the following guidance:



But avoid



To learn more, see our tips on writing great answers.



Required, but never shown



Required, but never shown




By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Edmonton

Crossroads (UK TV series)