[Bug 974147] Re: /lib/init/upstart-job should not start/restart a job which is disabled.
James Hunt
974147 at bugs.launchpad.net
Tue Apr 10 08:27:13 UTC 2012
Hi Steve,
The changes already will stop a job that was started manually (since we
fall through the 'if' tests and invoke "$COMMAND "$JOB", where $COMMAND
is 'stop').
I've tweaked the logic for restart such that for disabled jobs the
behaviour is now:
- if the job is running, 'upstart-job start' will just exit
(since nothing to do).
- if the job is not running, 'upstart-job start' will just exit
(since job is disabled).
- if the job is running, 'upstart-job stop' will stop the job
(since job was forced into start state).
- if the job is not running, 'upstart-job stop' will just exit
(since nothing to do).
- if the job is running, 'upstart-job restart' will restart the job
(since job was forced into start state and admins will expect this behaviour).
- if the job is not running, 'upstart-job restart' will just exit
(since job is disabled).
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to upstart in Ubuntu.
https://bugs.launchpad.net/bugs/974147
Title:
/lib/init/upstart-job should not start/restart a job which is
disabled.
Status in “upstart” package in Ubuntu:
In Progress
Bug description:
Package maintainer scripts often call:
invoke-rc.d $service restart
... to ensure that if a service is running, it gets restarted after
upgrade. invoke-rc.d is a SysV tool and the premise here is that
calling /etc/init.d/$service will be a NOP if the service in question
has not been enabled (for example /etc/default/$service might contain
'DISABLED=1' or similar).
However, with Upstart, this premise isn't correct. For an Upstart job,
calling 'invoke-rc.d $service restart' calls /lib/init/upstart-job
which then calls "stop $service; start $service". The problem here is
that if the service was disabled using the 'manual' stanza, *it will
still be started*.
This happens since what 'manual' does is to clear the 'start on' condition such that if an admin
disables a job using 'manual', it won't start on boot but it *will* start if forced with 'start'.
So, given the following, foo *will* start:
sudo stop foo
echo manual|sudo tee -a /etc/init/foo.override
sudo invoke-rc.d foo restart
\-> /lib/init/upstart-job
\-> start foo
To counter this, we could add a '--honour-manual' option to 'start' and make /lib/init/upstart-job
specify this option such that 'invoke-rc.d <name> restart' would only start a job if it had not
been explicitly disabled.
In fact, there is a simpler method: have /lib/init/upstart-job check to see if the job has a
'start on' condition. Crucially, note that the command below will *not* show a 'start on'
condition if the job was disabled using the 'manual' stanza:
initctl show-config -e "$JOB"|grep 'start on'
Then:
- if the job is running and has a 'start on', stop then start it (existing behaviour).
- if the job is not running and has a 'start on', start it (existing behaviour).
- if the job is running and does not have a 'start on', stop then start it
(since it was forcibly started).
- if the job is not running and does not have a 'start on', do nothing.
The last scenario being the key one.
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/upstart/+bug/974147/+subscriptions
More information about the foundations-bugs
mailing list