Systemd:一次重新启动实例化服务的所有实例


17

我使用systemd的一个不错的功能:实例化服务。

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

示例:我不想像这样运行所有程序:

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

我尝试了这个,但这不起作用

systemctl restart autossh@*

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

更新资料

首先,我对Instantiated Services着迷,但后来我意识到,运行像Ansible这样的配置管理工具更有意义。我了解到:保持工具简单。许多工具开始执行条件检查(如果.. else ...)并循环。例如,Web服务器或邮件服务器配置。但这应该在另一个(较高)级别上解决:配置管理。参见:https : //github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

Answers:


23

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

systemctl restart 'autossh@*'

对我不起作用:systemctl status 'autossh@*'输出:autossh@\x2a.service - ... Active: inactive (dead)版本:systemd 195
guettli

2
可以从systemd 209开始进行globbing
weirdan

如果您有很多服务要重新启动,那么guettli的答案中的while循环会更好地工作,因为通配符似乎试图立即重新启动它们。经过〜1000 php-fpm服务的测试,负载上升到400,我不得不重新启动服务器。
boutch55555

1
如果进程已经在运行,则可以使用,但如果在启用后必须首次启动,则无法使用。但是您可以使用systemctl restart autossh@{1..2}(使用任何N代替2),它的通用性稍差一些,但如果使用的话,它也将启动进程inactive (dead)
giorgiosironi

7

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

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

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


当心:cut如果列表单元输出中的服务失败,则可能解析错误的字段。
Juuso Ohtonen

5

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

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

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

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

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

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

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

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

2

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

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

您可以在此处找到称为说明符的说明

这表明:

%n

完整单位名称

%p

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

%一世

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

我不是直接回答您的问题,而是我想您正在尝试实现的目标。如果您认为可以按照此想法找到解决方案,请共享您的systemd脚本,这样我们最终可以通过示例进行说明,甚至可以为您提供最终的脚本。

如果您有信心编辑自己的脚本以达到这种解决方案,请在此处举个例子(我不会引用它,因为我不知道它是否与解决方案相关,并且太具体于我的意思了。我提议)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.