如何阻止属于同一目标的所有单位?

如何阻止属于同一目标的所有单位?

我想知道如何停止由同一目标组合在一起的所有单位。

我的设置如下。我有几个单元配置文件,内容如下:

[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)

相关内容