Upstart helpers (abstract jobs and event aliases) for Oneiric

Jan Claeys lists at janc.be
Wed Jun 8 01:35:34 UTC 2011


James Hunt schreef op di 07-06-2011 om 15:00 [+0100]:
> === Implementation ===
> 
> There are two simple methods here we're considering.
> 
> ==== Option 1 ====
> 
> Update every package that provides a service such that its Job
> Configuration File sets and exports a "well-known" variable. The
> proposed list of environment variables which represent these services
> is:
> 
>   DISPLAY_MANAGER
>   FIREWALL
>   GRAPHICS_CARD
>   NETWORK
>   NETWORK_MANAGER
> 
> For example, each display manager package would be updated such that its
> .conf file specified:
> 
>   env    DISPLAY_MANAGER=y
>   export DISPLAY_MANAGER
> 
> Then, any job that requires a display manager could say:
> 
>   start on starting DISPLAY_MANAGER=y
> 
> ===== Observations =====
> 
> - This might *appear* to be inefficient in that Upstart must check every
>   time *any* job starts to determine if DISPLAY_MANAGER=y is set in that
>   jobs environment. However, there is no additional overhead beyond how
>   Upstart currently works. Consider that...
> 
>     start on starting gdm
> 
>   ... is actually an alias for:
> 
>     start on stating JOB=gdm
> 
> - This would require *every* package that provides a service to be
>   updated. Admittedly this would only need to be done once though.

At least for every package that wants to support this...

> - Might be confusing since users you *must* specify "=y" exactly
>   (dropping the "=y" won't work, and nor will specifying "=Y" (or "=1")).

So, why not use something like SYSTEM_SERVICE=display-manager instead?
That would be less confusing...


The main disadvantage for this is that the start/stop/etc. command don't
work without a job name.  So you can't do a 'restart firewall', but you
have to check what firewall service is running, and then  restart that
job.  I'm not 100% sure this is bad or good though (services might have
different (default) behaviour despite providing the same service)?


> ==== Option 2 ====
> 
> Create a Job Configuration File that hard-codes the list of known
> service providers. For example for "display-manger", we could have:
> 
>   start on (starting gdm
>         or (starting kdm
>         or (starting lightdm
>         or (starting lxdm
>         or (starting slim
>         or (starting wdm
>         or  starting xdm))))))
> 
>   stop on (stopping gdm
>         or (stopping kdm
>         or (stopping lightdm
>         or (stopping lxdm
>         or (stopping slim
>         or (stopping wdm
>         or  stopping xdm))))))
> 
>   env    ABSTRACT_JOB=y
>   export ABSTRACT_JOB
> 
> ===== Observations =====
> 
> - Since this is an Abstract Job, it will have no PID, but this job will
>   "run" for the duration of the first display manager to be invoked.
> 
> - We appear to have simply "moved the problem" since although we are no
>   longer hard-coding the list of display managers in "plymouth.conf", we
>   are hard-coding the list now in "display-manager.conf". However, we
>   have gained by doing this since:
> 
>   - We have still created the level of abstraction desired.
>   - We have contained the problem into a single file: we define the list
>     of display managers *once*.
>   - We don't need to update every Ubuntu (and potentially every Debian)
>     package as would be required for "Option 1".
>   - We *could* conceivably auto-generate "display-manager.conf" from the
>     archive with a simple script which munged the output of:
> 
>     apt-cache search x-display-manager|awk '{print $1}'|sort

For some reason this doesn't give a complete list of all display
managers in the repository (maybe some of them aren't meant to be run at
boot like that, but some certainly do--that might be a bug in those
packages?), but more importantly this will never include display
managers that aren't in the official repositories.

> - The "ABSTRACT_JOB" variable would allow other jobs to detect that a
>   job was abstract (they shouldn't need to care, but just in case...)
>   This also avoids the unwieldliness of "abstract-display-manager" (or
>   even "abstract/display-manager" (were we to put the abstract jobs in
>   /etc/init/abstract/ say).


-- 
Jan Claeys




More information about the upstart-devel mailing list