/lib/init/upstart-job should not start/restart a job which is disabled.
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
upstart (Ubuntu) |
Fix Released
|
Medium
|
James Hunt |
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.
However, with Upstart, this premise isn't correct. For an Upstart job, calling 'invoke-rc.d $service restart' calls /lib/init/
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/
sudo invoke-rc.d foo restart
\-> /lib/init/
\-> start foo
To counter this, we could add a '--honour-manual' option to 'start' and make /lib/init/
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/
'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.
Related branches
- Steve Langasek: Pending requested
-
Diff: 53 lines (+21/-0)2 files modifieddebian/changelog (+10/-0)
debian/upstart-job (+11/-0)
Changed in upstart (Ubuntu): | |
assignee: | nobody → James Hunt (jamesodhunt) |
status: | New → In Progress |
importance: | Undecided → Medium |
Changed in upstart (Ubuntu): | |
assignee: | nobody → James Hunt (jamesodhunt) |
status: | New → In Progress |
+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.