Systemd 允许您创建模板单元,如中所述系统单元。
您可以在模板单元中使用许多变量。
我对......感兴趣"%j"
:
这是最后一个“-”和前缀名称末尾之间的字符串。
“前缀名称”也被定义:
对于实例化单元,这是指单元名称的第一个“@”字符之前的字符串。
我很清楚什么他们是,不清楚为什么它们存在。
我猜他们可能正在运行同一服务的多个版本。现实世界中如何使用它的示例是什么?
答案1
单元可以在.d/
单元旁边的目录中具有其他设置。例如,foo.service
可以通过 进行扩展foo.service.d/*.conf
。
模板单元将使用两个目录 - 实例和模板,因此[email protected]
将从两个目录进行扩展[email protected]/*.conf
和 [email protected]/*.conf
。这样您就可以一次扩展该单元的所有实例。在这两种情况下,您的设备及其扩展配置可以使用 %i 来获取“ttyS1”位。
然而,某些单元不能使用模板,例如切片(代表 cgroup)被命名user-<UID>.slice
,而不是user@<UID>.slice
因为这些单元的名称代表一个文件系统路径(破折号映射到斜杠,因此“user-123.slice”是“user.slice”的子项)。
因为希望能够配置所有单独的用户切片(例如,给每个切片 x% 的内存),所以为使用类路径名称的单元添加了类似的机制:与上面的 getty 示例类似,该单元user-1000.slice
可以扩展来自两者user-1000.slice.d/
和 user-.slice.d/
,后一个通用目录中的文件能够使用 %j 来获取“1000”位。
最后一个示例在实践中由默认的 systemd 安装使用:
$ systemctl cat user-1000.slice
# /usr/lib/systemd/system/user-.slice.d/10-defaults.conf
[Unit]
Description=User Slice of UID %j
答案2
其中一个示例可能是引用名称中的路径的系统单元。在此类单位中,/
被替换为-
(并且前导-
被删除)。例如,安装单元/home/muru
将被命名为home-muru.mount
。同样,当我运行时,我可以看到其他基于路径的单元名称systemctl list-units
:
sys-devices-platform-soc-3f980000.usb-usb1-1\x2d1-1\x2d1.5-1\x2d1.5:1.0-host0-target0:0:0-0:0:0:0>
sys-devices-platform-soc-3f980000.usb-usb1-1\x2d1-1\x2d1.5-1\x2d1.5:1.0-host0-target0:0:0-0:0:0:0>
sys-devices-virtual-misc-rfkill.device loaded active plugged /sys/devices/virtual/misc
sys-devices-virtual-tty-ttyprintk.device loaded active plugged /sys/devices/virtual/tty/
sys-module-configfs.device loaded active plugged /sys/module/configfs
sys-subsystem-net-devices-eth0.device loaded active plugged SMSC9512/9514 Fast Ethern
sys-subsystem-net-devices-wlan0.device loaded active plugged /sys/subsystem/net/device
在其中许多中,路径的最后一个组成部分(即由 给出的部分%j
)可能在单元内有用。我不知道其中是否有任何一个实际上使用该名称,但它可能很方便,例如,用于获取 in 、 in或类似目录%j
的安装单元生成器的用户名。/home
/run/user