Discussion:
[systemd-devel] Alias for template/instance service unit
Hans Gruber
2021-04-22 18:18:01 UTC
Permalink
Hello,
I am having problems with the aliases and "Alias=' directive related to the template service unit.
According to https://www.freedesktop.org/software/systemd/man/systemd.unit.html
I have exactly these two cases and requirements and cannot find example.
  "A template may be aliased by another template (in which case the alias applies to all instances of the template)"
eg: How to create an alias using `Alias=` for a service template ***@.service which will have maybe 2 instances (eg: ***@tty11.service ***@tty12.service ..) which will apply to only instance ***@tty12.service when enabled using eg: tty12-***@tty12.service.

I can't apply any alias using "Alias=" directive for two different template .service unit.Whatever I use for "Alias=" directive in the two cases inside the templates, instance service works, all symlink are created when instance is enabled, instance services are started as expected using their names, but all alias are always reporting
"Loaded: error (Reason: unit alasname failed to load properly: File exists)"

Alias=***@.service
Alias=allcores@%i.serviceAlias=alias@*.service
Alias=tty12-tailoutput@%i.service
Alias=%i-***@.service
Alias=***@tty12.serviceAlias=alias-%n

Thank you in advance.
Regards
Mantas Mikulėnas
2021-04-22 18:49:39 UTC
Permalink
Post by Hans Gruber
Hello,
I am having problems with the aliases and "Alias=' directive related to
the template service unit.
According to
https://www.freedesktop.org/software/systemd/man/systemd.unit.html
"A template instance may only be aliased by another template instance,
and the instance part must be identical. A template may be aliased by
another template (in which case the alias applies to all instances of the
that case, just this specific instance is aliased, while other instances of
aliased. Those rule preserve the requirement that the instance (if any) is
always uniquely defined for a given unit and all its aliases."
I have exactly these two cases and requirements and cannot find example.
"A template may be aliased by another template (in which case the alias
applies to all instances of the template)"
I think you're misunderstanding what "applies to all instances" means. It
does not give you a super-unit that controls all instances in unison --
rather, it gives you a template alias that will provide an alias for *each
instance individually*.

But one instance is still aliased to one instance. For example, if you
alias ***@.service => ***@.service, then you automatically get
***@cpu1.service => ***@cpu1.service, and so on. That's what template
aliases do.

If you want to control multiple instances at once, you might be looking for
two other features:
1. Custom target units, which allow you to *start* all instances at once;
2. Wildcard support in `systemctl` commands, which allows you to see the
status of all loaded instances at once (systemctl status "foo@*.service").
--
Mantas Mikulėnas
Hans Gruber
2021-04-22 21:20:28 UTC
Permalink
Hello,
Thank you for your really appreciated advice.
I confirm that I misunderstood what "applies to all instances" means.So now seems clear. Thanks
But there is something I don't understand.

I have two templates.The second one which is a simple instance of a tail > /dev/ttyX under ***@.serviceI renamed it to ***@.service (I don't have something which have foo* or bar* as name and previous ***@.service doesn't not exist anymore)

I have this [Install] Section:WantedBy=getty.targetDefaultInstance=tty12Alias=***@.service
systemctl enable ***@tty12.service> Created symlink /etc/systemd/system/***@tty12.service => /etc/systemd/system/***@.service> Created symlink /etc/systemd/system/getty.target.wants/***@tty12.service => /etc/systemd/system/***@service
Systemctl status ***@tty12.service> Loaded: error (Reason: Unit ***@tty12.service to load properly: File Exists)
Systemctl start ***@tty12.service = KO> Failed to start ***@tty12.service: Unit ***@tty12.service failed to load properly: File Exists.> See system logs and systemctl status ***@tty12.service for details
Systemctl start ***@tty12.service = OK
RegardsHans


Le jeudi 22 avril 2021 à 20:49:52 UTC+2, Mantas Mikulėnas <***@gmail.com> a écrit :

On Thu, Apr 22, 2021 at 9:18 PM Hans Gruber <***@yahoo.fr> wrote:

Hello,
I am having problems with the aliases and "Alias=' directive related to the template service unit.
According to https://www.freedesktop.org/software/systemd/man/systemd.unit.html
I have exactly these two cases and requirements and cannot find example.
  "A template may be aliased by another template (in which case the alias applies to all instances of the template)"
eg: How to create an alias using `Alias=` for a service template ***@.service which will have maybe 8 or 16 instances (eg: ***@cpu01.service ***@cpu02.service ..) which will apply to all instances when enabled using eg ***@.service.


I think you're misunderstanding what "applies to all instances" means. It does not give you a super-unit that controls all instances in unison -- rather, it gives you a template alias that will provide an alias for *each instance individually*.
But one instance is still aliased to one instance. For example, if you alias ***@.service => ***@.service, then you automatically get ***@cpu1.service => ***@cpu1.service, and so on. That's what template aliases do.
If you want to control multiple instances at once, you might be looking for two other features:1. Custom target units, which allow you to *start* all instances at once;
2. Wildcard support in `systemctl` commands, which allows you to see the status of all loaded instances at once (systemctl status "foo@*.service").
--
Mantas Mikulėnas
Loading...