[systemd-devel] Start and stop requests for a service

Lennart Poettering lennart at poettering.net
Mon Sep 30 18:51:02 PDT 2013


On Fri, 27.09.13 11:37, Umut Tezduyar (umut at tezduyar.com) wrote:

> Hi,
> 
> I have noticed that ExecStop is not being run on following service
> with following requests:
> 
> [Service]
> Type=oneshot
> RemainAfterExit=yes
> ExecStart=/bin/sh -c "sleep 20 && /usr/bin/systemd-cat echo ExecStart.."
> ExecStop=/bin/sh -c "/usr/bin/systemd-cat echo ExecStop.."
> 
> 
> $> systemctl start hello.service &
> $> systemctl stop hello.service
> 
> I have couple discussions:
> 
> 1) When a "oneshot" service is being in activating state, why doesn't
> "stop" request wait for the service to become "active"? I would expect
> systemd to queue "stop" request as long as service is in "activating"
> state. I think this kind of behavior is fine for Type=simple but not
> for Type=oneshot. KillMode=none is the only way to provide atomicity.

Well, the thinking was that people would be annoyed if "systemctl start"
hangs and they C-c it, and then do "systemctl stop" this hangs too...

In the case of Type=oneshot I think people would be particularly annoyed
if it wouldn't act immediately, after all Type=oneshot is the kind of
service where *all* interesting bits only happen during "activating"
state...

Not following regarding the atomicity?

> 2) If I have an "ExecStop" directive, I would expect it to run no
> matter what. My solution is moving ExecStop to ExecStopPost.

The idea was that ExecStop= is the clean way down, and ExecStopPost= the
last resort thing to clean things up...

> My use case: I have a service which sets up ip filters on ExecStart
> and removes the filters on ExecStop. Setting up ip filters is done by
> a script. I have ended up finding my target in an inacceptable state
> due to "start" "stop" request coming right after each other.

Hmm, so, but using ExecStopPost= should fix the issue for you, no?

I think I don't fully get the problem, can you elaborate?

There are three options basically, what to do if we get a stop request
while we are starting something:

a) wait until start finished, then immediately stop. -- I think this
   would be a bad idea, as pointed out above

b) immediately go to ExecStop= if there is. -- I think this would be a
   bad idea, since ExecStop='s job is to do a clean shutdown, and
   something that has not started up fully is unlikely to shutdown
   cleanly.

c) immediately go to SIGTERM/ExecStopPost=. Which seems to be the most
   reliable choice and is what is currently implemented.

Can you may a good case why a) or b) would actually be the better choice?

Lennart

-- 
Lennart Poettering - Red Hat, Inc.


More information about the systemd-devel mailing list