【问题标题】:Complex restart of group of units within systemdsystemd 中单元组的复杂重启
【发布时间】:2017-05-24 08:17:42
【问题描述】:

我的应用由 haproxy 单元和应用本身的 5 个单元(app@1、app@2 等)组成。

我有一个用于重启的 bash 脚本

systemctl reload hapoxy
echo "disable server myapp/app-1" | socat stdio /var/run/haproxy-admin
systemctl restart 'app@1'
echo "enable server myapp/app-1" | socat stdio /var/run/haproxy-admin
echo "disable server myapp/app-2" | socat stdio /var/run/haproxy-admin
systemctl restart 'app@2'
echo "enable server myapp/app-2" | socat stdio /var/run/haproxy-admin
...
cache warm-up
other stuff

但我想知道,有没有办法通过 systemd 运行重启?

附:我有 myapp.target 与这些单元和 haproxy 作为依赖项,但目标文件没有重启命令。

【问题讨论】:

    标签: linux systemd


    【解决方案1】:

    您可以使用PartOf=。来自man systemd.unit

    部分= 配置类似于 Requires= 的依赖项,但仅限于停止和重新启动单元。当 systemd 停止或重新启动时 此处列出的单位, 动作被传播到这个单元。请注意,这是一种单向依赖——对此单元的更改不会影响列出的 单位。

    所以你可以创建一个新的单元文件,然后将所有你想重新启动的东西一起“PartOf=”这个新单元。然后重新启动新单元将重新启动您想要的一切。

    这个话题在How to create a virtual systemd service to stop/start several instances together?有更多讨论

    【讨论】:

    • 但是这个“新单元文件”的主 pid 会是什么进程呢?我相信将目标文件用于这种分组(没有单独的进程)更合适,但目标文件没有重启命令。我可以创建一个伪造的单元文件,其中包含一些只是无限循环的过程,但感觉不对。
    • @KirillFuntov 我同意目标单元对此有好处,stopstartrestart 都可以在它们上面工作......我刚刚在我的 Ubuntu 笔记本电脑上测试了systemctl restart bluetooth.target。您是否找到了一些说明重启对目标不起作用的文档?
    • 停止、启动和其他东西对目标起作用。但他们仅限于基本上为他们的单位发送停止、启动或重新启动命令。我看不到在重新启动整个单元时执行自定义脚本的方法。
    猜你喜欢
    • 2020-08-21
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2018-05-31
    • 2016-07-20
    • 2014-05-01
    相关资源
    最近更新 更多