[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