[Bug 974147] Re: /lib/init/upstart-job should not start/restart a job which is disabled.
Steve Langasek
steve.langasek at canonical.com
Thu Apr 5 17:02:14 UTC 2012
+1 for having upstart-job check for a start condition before starting a
job. Please make sure that when asked to *stop* a job, however, that it
correctly stops any service that had been started manually; and that if
the service is running and it's asked to restart, that the job will be
restarted even if not configured to start automatically.
As an aside, for upstart in Ubuntu this logic will have to be put in
invoke-rc.d since /lib/init/upstart-job will not be used there.
** Changed in: upstart (Ubuntu)
Status: In Progress => New
** Changed in: upstart (Ubuntu)
Assignee: James Hunt (jamesodhunt) => (unassigned)
--
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:
New
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