[systemd-devel] Synchronization Between Services at Shutdown

Kurt von Laven kurt at endlessm.com
Wed Apr 1 23:44:16 PDT 2015


Thanks for the quick reply, Andrei. It sounds like there is indeed a race
condition in my code then since there is nothing explicit in my
implementation of service A that makes it wait until it has processed the
method call from service B before it stops listening for method calls. Did
I get that right?

On Wed, Apr 1, 2015 at 8:26 PM, Andrei Borzenkov <arvidjaar at gmail.com>
wrote:

> В Wed, 1 Apr 2015 18:22:50 -0700
> Kurt von Laven <kurt at endlessm.com> пишет:
>
> > Hello folks,
> >
> > I am trying to ensure that my system DBus service has time to handle a
> DBus
> > method call before it shuts down. My DBus service is implemented as a
> > system systemd service; let's call it service A. It runs a
> single-threaded,
> > synchronous event loop that listens for DBus method calls and handles
> them
> > appropriately. This event loop also listens for SIGTERM. When SIGTERM is
> > received, service A currently terminates the event loop, performs any
> > necessary writes to disk, and releases its resources. I am assuming that
> > when the system is shut down cleanly, systemd initially sends SIGTERM to
> > systemd services and only sends SIGKILL to abort it abruptly if it takes
> > too long to shut down when asked nicely.
> >
> > I have another system systemd service, call it service B, that runs an
> > event loop listening for SIGTERM. When service B receives a SIGTERM, it
> > makes the aforementioned DBus method call and then flushes the system
> bus.
> > Service B specifies Requires=
> > <
> http://www.freedesktop.org/software/systemd/man/systemd.unit.html#Requires=
> >Service
> > A and After=
> > <
> http://www.freedesktop.org/software/systemd/man/systemd.unit.html#Before=
> >Service
> > A. Service A makes no mention of service B in its unit configuration
> file.
> > Does systemd make any sort of guarantee that service A will get a chance
> to
> > handle the DBus method call before receiving SIGTERM, or does my code as
> > written have a race condition?
> >
>
> systemd will not initiate stopping of A before B has stopped. If it
> does, this should be considered a bug. So it is up to service B to
> handle termination correctly. Note that systemd will send SIGKILL after
> timeout if service has not terminated.
>



-- 
Kurt von Laven | Endless Mobile |  EndlessM.com <http://endlessm.com/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/systemd-devel/attachments/20150401/c8487562/attachment.html>


More information about the systemd-devel mailing list