[systemd-devel] multiple instance template variable

Lennart Poettering lennart at poettering.net
Thu Jan 3 13:06:42 PST 2013


On Thu, 03.01.13 21:23, Thomas Schreiber (tom at rizu.mu) wrote:

> Hi,
> 
> I've followed this example with success: http://superuser.com/a/393429/77086
> 
> However, I am trying to do one more variable substitution by altering the
> path to the executable used by ExecStart:
> 
> # cat /usr/lib/systemd/system/uwsgi at .service
> [Unit]
> Description=uWSGI service for %i
> After=syslog.target
> 
> [Service]
> ExecStart=/srv/.virtualenvs/%i/bin/uwsgi --ini /etc/uwsgi/%i.ini
> ExecReload=/bin/kill -HUP $MAINPID
> KillSignal=SIGINT
> Restart=always
> Type=simple
> 
> [Install]
> WantedBy=multi-user.target
> 
> # systemctl status uwsgi at myproject
> uwsgi at myproject.service - uWSGI service for myproject
>       Loaded: loaded (/usr/lib/systemd/system/uwsgi at .service; enabled)
>       Active: failed (Result: start-limit) since Thu, 2013-01-03 14:01:31
> CST; 4s ago
>      Process: 23921 ExecStart=/srv/.virtualenvs/%i/bin/uwsgi --ini
> /etc/uwsgi/%i.ini (code=exited, status=203/EXEC)
>       CGroup: name=systemd:/system/uwsgi at .service/myproject
> 
> systemd[1]: Started uWSGI service for myproject.
> systemd[1]: uwsgi at myproject.service: main process exited, code=exited,
> status=203/EXEC
> systemd[1]: Unit uwsgi at myproject.service entered failed state
> systemd[1]: Stopping uWSGI service for myproject...
> systemd[1]: Starting uWSGI service for myproject...
> systemd[1]: Failed to start uWSGI service for myproject.
> systemd[1]: Unit uwsgi at myproject.service entered failed state
> 
> # cat /etc/issue
> Arch Linux \r (\l)
> 
> # uname -a
> Linux noufos 3.6.10-1-ARCH #1 SMP PREEMPT Tue Dec 11 09:40:17 CET 2012
> x86_64 GNU/Linux
> 
> # systemctl --version
> systemd 196
> arch
> +PAM -LIBWRAP -AUDIT -SELINUX -IMA -SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ
> 
> Everything in this script works except the first %i variable on the
> ExecStart line because I can get the service to start correctly simply by
> hardcoding the path to the uwsgi executable:
> 
>      ExecStart=/srv/.virtualenvs/myproject/bin/uwsgi --ini /etc/uwsgi/%i.ini
> 
> So I am wondering if this is a bug or intentional behavior. Alternative
> suggestions to using the template appreciated.

This is intentional behaviour. This is only documented indirectly
however (i.e. systemd.service(5) says that env vars are not replaced for
the first argument, but % specifiers are also not replaced. I have now
changed git to clarify this.

The reason behind this is that on SELinux systems we might need to know
the path of a binary before a service is instantiated (in order to label
things correctly). This becomes really hard if the first argument is
dynamic. We could in theory lift this limitation in a number of cases,
but I am afraid of lifting this entirely in order to make sure that unit
files written on non-SELinux systems still work fine on SELinux
systems...

A simple work-around is to invoke your command through /usr/bin/env.

Lennart

-- 
Lennart Poettering - Red Hat, Inc.


More information about the systemd-devel mailing list