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 email@example.com > journalctl --user -f Nov 17 22:21:02 miles-desk systemd: Starting firstname.lastname@example.org... Nov 17 22:21:02 miles-desk sh: bottom Nov 17 22:21:02 miles-desk systemd: Starting email@example.com... Nov 17 22:21:02 miles-desk systemd: Finished firstname.lastname@example.org. Nov 17 22:21:02 miles-desk sh: middle Nov 17 22:21:02 miles-desk systemd: Finished email@example.com.
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