[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