Debian 手册 (https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html#s-maintscripts) 说以下内容preinst
:
许多“preinst”脚本会停止正在升级的软件包的服务,直到其安装或升级完成
这关于prerm
:
此脚本通常会停止与包关联的任何守护程序。
据我了解,升级将调用prerm
旧包和preinst
新包,并且仅在删除包时prerm
才会调用。
那么,如果我创建一个包含服务的 debian 软件包,是否有任何充分的理由更喜欢preinst
使用prerm
?或者我两者都需要?
答案1
您链接到的文档是常见问题解答,虽然相关,但不一定被视为权威(尽管区别可能很微妙,任何不一致实际上都是一个错误)。权威文档是 Debian Policy Manual,其中有一个整章专门讨论维护者脚本。因为这并不那么容易阅读,所以有wiki 上有用的图表它解释了维护者脚本之间的关系。
基本上,唯一的脚本需要停止匹配包中的服务是prerm
;正如您所指出的,在删除软件包以及升级软件包时会调用此脚本。在某些情况下,重要的一点是prerm
默认使用已安装包的脚本;如果在升级之前失败,打包系统也会尝试升级的prerm
脚本。
preinst
总是在升级期间出现prerm
,并且在运行时服务应该停止。为了确定起见,某些软件包的preinst
脚本确实会尝试再次停止服务;这方面的例子包括mysql-server-5.6
和timidity
,但数量并不多。
所以总而言之,你必须在 中停止你的服务prerm
,你也可以在 中这样做preinst
(尽管实际上没有必要);你一定不能偏爱preinst
这个prerm
,而且你不需要两者兼而有之。我只想用prerm
.
(严格来说,我应该澄清,《政策手册》是描述性的而不是规定性的,因为它记录了当前的实践而不是定义它——所以它并不像你想象的那样具有权威性,并且实践在记录之前确实在发展。但是在这种特殊情况下,策略是准确的,因为知道prerm
是否需要升级,所以可能会尝试一些巧妙的技巧并让服务保持运行状态,直到稍后的脚本可以重新启动它们,以减少服务。停机;但这只是自找麻烦。)