假设我有两个包,A
和B
,每个包提供一项服务,a
和b
。
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 用户/维护者),