Is the systemd instance name specifier %i redundant when referring to templated dependencies?
Do we need to use the instance name specifier (%i
) in templates when referring to other templated services, or can we assume the instance name is inferred?
Many examples follow this pattern (e.g. Requires=bottom@%i.service
), but that %i
seems unnecessary, and things appear to work fine without it.
> cd ~/.config/systemd/user
> cat top@.target
[Unit]
# Wants=middle@%i.service
Wants=middle@.service
> cat middle@.service
[Unit]
# Requires=bottom@%i.service
Requires=bottom@.service
[Service]
ExecStart=/usr/bin/sh -c "echo middle"
> cat bottom@.service
[Service]
ExecStart=/usr/bin/sh -c "echo bottom"
> systemctl --user start top@foo.target
> journalctl --user -f
Nov 17 22:21:02 miles-desk systemd[3064]: Starting bottom@foo.service...
Nov 17 22:21:02 miles-desk sh[4010694]: bottom
Nov 17 22:21:02 miles-desk systemd[3064]: Starting middle@foo.service...
Nov 17 22:21:02 miles-desk systemd[3064]: Finished bottom@foo.service.
Nov 17 22:21:02 miles-desk sh[4010695]: middle
Nov 17 22:21:02 miles-desk systemd[3064]: Finished middle@foo.service.
Is it safe to omit the %i
specifier in templates? If so, then I’m confused why I haven’t been able to find any examples with this shorthand. Are there any gotchas to watch out for? I didn’t find any usage notes about this in the docs.
Requires
et al. handle templating directly:
In case when the source unit is a template, the target can also be a template, in which case the instance will be "propagated" to the target unit to form a valid unit instance.
And conversely for RequiredBy
and family:
A template unit may also list a template unit, in which case a generic dependency will be added where each instance of the listing unit will have a dependency on an instance of the listed template with the same instance value.
So for this use, yes, it is safe to omit %i
.