![Systemd 单元文件中 Wants= 与 WantedBy= 的最佳实践](https://linux22.com/image/170816/Systemd%20%E5%8D%95%E5%85%83%E6%96%87%E4%BB%B6%E4%B8%AD%20Wants%3D%20%E4%B8%8E%20WantedBy%3D%20%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.png)
据我从文档中可以看出系统,Wants=
并WantedBy=
执行相同的功能,只不过前者放入依赖单元文件中,反之亦然。 (然后WantedBy=
创建unit.type.wants
目录并用符号链接填充它。)
从DigitalOcean:了解 Systemd 单元和单元文件:
该指令...允许您以与该部分中的指令
WantedBy=
类似的方式指定依赖关系。不同之处在于,该指令包含在辅助单元中,允许列出的主要单元保持相对干净。Wants=
[Unit]
这真的只是为了保持单元文件“干净”吗?使用这两个指令的最佳实践是什么?也就是说,如果服务 alpha “想要”服务 beta,我应该何时使用Wants=beta.service
inalpha.service
以及何时应该WantedBy=alpha.service
在 中使用beta.service
?
答案1
功能上
Wants
位于Unit
部分 且WantedBy
位于Install
.
init 进程根本systemd
不处理/使用该Install
部分。相反,必须在 中创建符号链接multi-user.target.wants
。通常,这是由systemctl
读取该部分的实用程序完成的Install
。
总之,WantedBy
受systemctl enable
/影响systemctl disable
。
逻辑上
考虑哪些服务应该“知道”或“意识到”另一个服务。例如,常见的用法是WantedBy
:
[Install]
WantedBy=multi-user.target
或者,也可以在 multi-user.target 中:
[Unit]
Wants=nginx.service
但第二种方式没有意义。从逻辑上讲,nginx.service 知道系统定义的 multi-user.target,而不是相反。
因此,在您的示例中,如果 alpha 的作者知道 beta,那么 alphaWants
就是 beta。如果 beta 的作者知道 alpha,那么 beta 就是WantedBy
alpha。
为了帮助您做出决定,您可以考虑可以在不存在其他服务的情况下安装哪个服务(例如,从包管理器)。
配置目录
作为您盒子中的另一个工具,请知道 systemd 文件也可以使用配置目录进行扩展: /etc/systemd/system/myservice.service.d/extension.conf
这允许您添加依赖项,其中两个服务最初都不是为了了解另一个服务而创建的。我经常将其与挂载一起使用,例如,nginx 和挂载都不需要明确了解对方,但我作为系统管理员了解依赖性。所以我nginx.service.d/mymount.conf
用Wants=mnt-my.mount
.
答案2
这些在功能上并不相同。设置Wants=
(和符号链接文件)是依赖项。该WantedBy=
设置控制启用/禁用服务时此类依赖项的创建/销毁。
所以没有最好的实践。有正确的实践。对于任何给定情况,两者中只有一个具有正确的功能。要么想要拥有一种始终存在的持久依赖关系,要么想要拥有一种可以使用enable
/打开和关闭的暂时依赖关系disable
。