Systemd:立即重新启动实例化服务的所有实例

gue*_*tli 23 systemd

我使用了 systemd 的一个很好的特性:实例化服务。

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

示例:我不想像这样运行:

systemctl restart autossh@foo
systemctl restart autossh@bar
systemctl restart autossh@blu
Run Code Online (Sandbox Code Playgroud)

我试过了,但这不起作用

systemctl restart autossh@*
Run Code Online (Sandbox Code Playgroud)

相关:用一个 systemd 服务文件启动 N 个进程

更新

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

wei*_*dan 35

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

systemctl restart 'autossh@*'
Run Code Online (Sandbox Code Playgroud)

  • 从 systemd 209 开始可以使用 Globbing:https://lists.freedesktop.org/archives/systemd-devel/2014-February/017146.html (2认同)

gue*_*tli 7

不好,但这适用于具有旧 systemd 的系统:

systemctl list-units -t service --full| cut -d' ' -f1| grep mypattern | while read s; do systemctl restart $s; done
Run Code Online (Sandbox Code Playgroud)

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


小智 6

@weirdan 答案是正确的,但缺少某些发行版的内容。

对于Centos 7 和类似版本,您可以执行以下操作:

systemctl (start|stop|restart|status) my-service@*
Run Code Online (Sandbox Code Playgroud)

但是,(开始)将仅工作,如果您指定标志“--all”:

systemctl (start) my-service@* --all
Run Code Online (Sandbox Code Playgroud)

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

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

systemctl (start|stop|restart|status) 'my-service@*' --all
Run Code Online (Sandbox Code Playgroud)