在 Ubuntu 上更新中级服务的正确步骤是什么?

在 Ubuntu 上更新中级服务的正确步骤是什么?

假设我有两个包,AB,每个包提供一项服务,ab

b取决于a。换句话说,如果服务a当前处于活动状态(正在运行),那么我可以b毫无问题地启动和停止。但是,如果a不处于活动状态,则b不应启动,至少在未先尝试启动 的情况下不应启动a。同样,如果我想停止a,那么我希望b先将其关闭,然后再a。这一切与 配合得很好systemd

我对包进行了修复A

当我运行时,包的正确行为是什么dpkg --install A

显然,A可能对 一无所知B。因此,如果prerm的脚本A运行:

systemctl stop a

它也会b随之倒下。

A然后安装新版本并在postinst我重新启动时a使用:

systemctl start a

这是升级软件包的预期程序吗A? 总是会以systemd某种方式记住自动重启b?如果我有更多的依赖项怎么办?

答案1

在 systemd 中,systemctl restart与 stop+start 对相比,该操作具有特殊的行为:

  • systemctl restart a— 停止 b,停止 a,启动 a,启动 b (即重新启动相关单元,全部按正确顺序)
  • systemctl stop a && systemctl start a— 停止 b,停止 a,启动 a(即不是记住依赖单位)

请注意,这仅当 b.service 具有时才会发生Requires=a.service。Wants=、After= 和 Before= 不启用此特殊行为(但After=a.service很可能也需要按顺序停止和启动彼此)。

systemctl restart因此,为了使其正常工作,如果它们的第一个参数是,则可能不需要从 A 的 prerm 脚本和 A 的 postrm 脚本运行任何内容,否则upgrade运行 normal systemctl stop+ systemctl start。(注意:我可能错了 — 不是 Debian 用户/维护者),

相关内容