preinst 和 prerm 脚本应该停止哪些服务?

Ben*_*nno 5 debian deb

debian 手册 ( https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html#s-maintscripts ) 说明了以下内容preinst

许多“preinst”脚本会停止正在升级的软件包的服务,直到它们的安装或升级完成

这关于prerm

此脚本通常会停止与包关联的任何守护程序。

据我所知,升级将同时调用prerm旧包和preinst新包,并且仅在删除包时prerm调用。

所以,如果我创建一个包含服务的 debian 包,有什么好的理由更喜欢使用preinstoverprerm吗?还是我两者都需要?

Ste*_*itt 6

您链接到的文档是常见问题解答,虽然相关,但并不一定被视为权威(尽管区别可能很微妙,任何不一致都是错误)。权威文档是 Debian Policy Manual,其中有一整章专门介绍维护者脚本。因为这并不是那么容易阅读,所以wiki 上有一些有用的图表来解释维护者脚本之间的关系。

基本上,唯一需要停止匹配包中的服务的脚本是prerm; 正如您指出的那样,在删除包以及升级包时会调用此脚本。在某些情况下,重要的一点是它prerm是默认使用的已安装包的脚本;如果在升级前失败,打包系统也会尝试升级后的prerm脚本。

preinst总是prerm在升级过程中出现,并且在它运行时服务应该停止。一些包的preinst脚本确实尝试再次停止服务,只是为了确定;这方面的例子包括mysql-server-5.6timidity,但并不多。

所以总而言之,您必须在 中停止您的服务prerm,并且您也可以这样做preinst(尽管没有必要有效);你不能喜欢preinstprerm了这一点,你不需要两者。我只是使用prerm.

(严格来说,我应该澄清政策手册是描述性的而不是规定性的,因为它记录了当前的实践而不是定义了它——所以它不像你想象的那样具有权威性,而且实践在它们被记录在那里之前确实发生了变化。但是在这种特殊情况下 Policy 是准确的。虽然我在做它,因为prerm知道它是否被调用进行升级,它可能很想尝试聪明的技巧并让服务运行直到稍后的脚本可以重新启动它们,以减少服务停机时间;但这只是自找麻烦。)