我想知道如何停止由同一目标组合在一起的所有单位。
我的设置如下。我有几个单元配置文件,内容如下:
[Unit]
...
[Service]
...
[Install]
WantedBy=mycustom.target
当我跑步时
# systemctl start mycustom.target
那些“被需要”的单位mycustom.target
正确启动。现在,我还希望能够阻止 想要的所有单位mycustom.target
。我试过:
# systemctl stop mycustom.target
但这没有任何作用。有没有一种方法可以使这项工作顺利进行,而不必停止同一目标(明确)想要的所有单位?
答案1
使用PartOf=
指令。
配置类似于 Requires= 的依赖关系,但仅限于停止和重新启动单元。当 systemd 停止或重新启动此处列出的单元时,操作将传播到该单元。请注意,这是一种单向依赖关系 - 对此单位的更改不会影响列出的单位。
PartOf=mycustom.target
答案2
编辑:PartOf=
在编写此答案时不存在的指令是一个更好的解决方案。详情请参阅另一个答案。
有两种方式:隐式和显式。
第一种方式——StopWhenUnneeded=
第一种方法是使用StopWhenUnneeded=
指示。如果某个单元具有,则StopWhenUnneeded=yes
当该单元不再存在活动单元时,该单元将自动停止。因此:Wants=
Requires=
- 仅当这些单位是
WantedBy=
仅有的经过mycustom.target
; - 您将无法手动启动这些单元中的任何一个(
systemctl start myunit.service
即启动它并随后立即停止它)。
第二种方式——shell管道
第二种方法是构造一个简单的shell管道,用于systemctl show -p
提取mycustom.target
.
更具体地说,systemctl show UNIT
将显示全部以 KEY=VALUE 形式显示单元的属性,并且systemctl show -p PROPERTIES UNIT
会执行相同的操作,限制显示的属性集。所以:
systemctl stop -- $(systemctl show -p Wants mycustom.target | cut -d= -f2)