我有许多需要重启的服务单元文件,但我不想把它们全部输入出来。是否可以有一个目标或服务,它不知道如何启动其他服务,但将它们组合在一起,这样它们就都可以通过一个命令重启?
如果我想要的话,我该如何编写我的 systemd 服务单元文件或目标文件systemctl restart one-to-rule-them-all
?
要求:1. uber 目标需要启动许多其他服务。2. uber 目标不应该知道如何启动这些服务。
当我尝试这样做时,sudo systemctl restart one-to-rule.target
什么也没有发生。
# /etc/systemd/system/one-to-rule.target
[Unit]
Description=One To Rule Them All
Requires=multi-user.target
Wants=program-api.service program-gui.service yet-another.service
After=multi-user.target display-manager.service
[Install]
WantedBy=graphical.target
这些单元program-api.service
program-gui.service
yet-another.service
和one-to-rule.target
所有单元都已启用,并且它们似乎都已加载并处于活动状态。我可以启动机器,并且所有服务都完全按照我的要求启动。但是,我只想输入systemctl restart one-to-rule.target
或执行其他操作,而不是重新启动。
依赖关系图如下所示
$ systemctl list-dependencies one-to-rule.target
one-to-rule.target
● ├─program-api.service
● ├─program-gui.service
● ├─yet-another.service
● └─multi-user.target
$ systemctl list-dependencies --reverse one-to-rule.target
one-to-rule.target
● └─graphical.target
答案1
这可以工作,但每个 .service 单元必须具有PartOf=one-to-rule.target
才能将重启传播给它们。(这实际上只是 的弱化版本Requires=<…>.target
。)
不幸的是,无法直接在目标中指定相反的依赖关系(ConsistsOf)——您需要扩展所有服务文件。