为什么有些单元文件名以@结尾?

为什么有些单元文件名以@结尾?

某些应用程序(例如 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]文件名的单元,尽管按照惯例,这种“冲突”很少发生,即大多数包含@符号的单元文件都应该是模板。

来源

相关内容