某些应用程序(例如 ssh)具有以 @ 结尾的单元文件,例如ssh.service
和[email protected]
。它们包含不同的内容,但我无法理解功能或目的到底有什么区别。
这是我不知道的命名约定吗?
答案1
正如其他人提到的,它是一个服务模板。在特定情况下[email protected]
,它仅用于sshd
以经典服务的方式按需调用inetd
。
如果您希望很少使用 SSH 连接,并且希望绝对减少sshd
系统资源的使用(例如在嵌入式系统中),您可以禁用常规连接ssh.service
并启用ssh.socket
.然后,只要检测到 TCP 端口 22(标准 SSH 端口)的传入连接,套接字就会自动启动一个实例[email protected]
(运行)。这会减慢 SSH 登录过程,但在没有入站 SSH 连接时sshd -i
无需运行。sshd
答案2
它是一个模板:https://www.freedesktop.org/software/systemd/man/systemd.service.html#Service%20Templates
[email protected]
它是通过创建到链接源所在位置的链接来实例化的[email protected]
。使用或instance
可以在 systemd 单元文件中使用的值,并允许您编写可与参数一起多次使用的单个单元配置文件。%i
%I
虽然最清晰的 systemd 文档是“服务模板”,但您可以模板化任何单元类型,如 systemd.unit(5) 手册页中所述:https://www.freedesktop.org/software/systemd/man/systemd.unit.html
答案3
这些都是服务模板,设计为使用参数实例化(因此服务是,使用给定参数template@argument
运行服务)。template@
因此,单个服务定义可以在不同的情况下使用,而不需要任何硬编码的细节。
您将看到的典型实例化服务是每个文件系统服务,例如systemd-fsck@
服务、每个设备getty
、每个用户的用户管理器 ( user@
) 等。它们可以按照与非模板化服务相同的方式设置,使用systemctl enable
等等,但许多都是由其他服务动态实例化的。
答案4
有些单位名称包含一个
@
符号(例如[email protected]
):这意味着它们是实例模板单元的实际文件名不包含该string
部分(例如[email protected]
)。string
被称为实例标识符,并且类似于使用 调用时传递给模板单元的参数系统控制命令:在单元文件中它将替换%i
说明符。更准确地说,在尝试实例化[email protected]
模板单元之前,systemd 实际上会查找具有确切[email protected]
文件名的单元,尽管按照惯例,这种“冲突”很少发生,即大多数包含@
符号的单元文件都应该是模板。