更新

更新

我使用了 systemd 的优秀功能:实例化服务。

有没有一种简单的方法可以通过一次调用重新加载所有实例化的服务?

例如:我不想全部像这样运行:

systemctl restart autossh@foo
systemctl restart autossh@bar
systemctl restart autossh@blu

我试过了,但是没有用

systemctl restart autossh@*

有关的:使用一个 systemd 服务文件启动 N 个进程

更新

起初我对实例化服务很着迷,但后来我意识到运行像 Ansible 这样的配置管理工具更有意义。我学会了:保持工具简单。许多工具开始实现条件检查(if .. else ...)和循环。例如 Web 服务器或邮件服务器配置。但这应该在不同的(上层)级别解决:配置管理。参见:https://github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

答案1

Systemd(从 systemd-209 开始)支持通配符,但是您的 shell 可能会尝试扩展它们。使用引号将通配符逐字传递给 systemctl/service 命令:

systemctl restart 'autossh@*'

答案2

@weirdan 答案是正确的,但是对于某些分布来说缺少了一些东西。

为了Centos 7 及类似版本, 你可以做:

systemctl (start|stop|restart|status) my-service@*

但是,仅当您指定标志“--all”时,(start)才会起作用:

systemctl (start) my-service@* --all

否则,它将找不到服务,因为它们不存在。这是 systemd 想要的功能。

为了Ubuntu基于系统,它的工作方式几乎相同,但不同之处在于,必须为所有 systemctl 参数指定“--all”标志,否则它将不会执行任何操作。

systemctl (start|stop|restart|status) 'my-service@*' --all

答案3

虽然不太好,但是这对于具有旧 systemd 的系统有效:

systemctl list-units -t service --full| cut -d' ' -f1| grep mypattern | while read s; do systemctl restart $s; done

当然,上面的解决方案答案(systemctl restart 'autossh@*')更好。

答案4

我不知道 systemd 的终端上是否有通配符选项。您可以做的是在 systemd 脚本中添加一个。

我认为 %i 可以解决问题,但这与您编写实例化服务的方式有关。

你可能会找到一个解释这里称为说明符

这表明:

%n

完整单位名称

%p

对于实例化单元,这指的是单元名称中“@”字符之前的字符串。对于非实例化单元,这指的是删除类型后缀后的单元名称。

%我

对于实例化单元:这是“@”字符和单元名称后缀之间的字符串。单元名称

我不是直接回答你的问题,而是回答你猜测你想要实现的目标。如果你认为你的解决方案可以按照这个想法找到,请分享你的 systemd 脚本,这样我们最终可以用示例来说明,甚至可能为你提供最终的脚本。

如果您有信心通过编辑自己的脚本来找到解决方案,这里你有一个例子(我不会引用它,因为我不知道它是否与解决方案相关,并且对于我提出的建议来说太具体了)

相关内容