在软件包安装过程中,重启依赖服务的正确方法是什么?

我正在创建一个配置包,并希望停止和重新启动受到影响的服务。目前,我正在使用service [stop|restart]{pre,post}{inst,rm}的方式。我在某个问题中读到,invoke-rc.d是正确的方式,因为它尊重用户对服务的偏好。然而,我找不到任何关于这方面的指南。有人知道这样的指南吗?或者对我应该选择哪种方式有什么建议?该包是内部使用的,未来两年可能只适用于14.04版本。然而,我希望给我的继任者留下尽可能干净的状态,所以systemd也在我的考虑范围内。
invoke-rc.d man page中可以看到:

Debian软件包维护脚本应通过invoke-rc.d来访问所有init脚本。

从Debian政策手册第9章,第3.3节中可以看到:
维护者应该使用update-rc.d和invoke-rc.d程序提供的抽象层来处理其软件包脚本(如postinst、prerm和postrm)中的initscripts。
...
软件包维护者脚本必须使用invoke-rc.d来调用/etc/init.d/* initscripts,而不是直接调用它们。
Debian一直在使用sysv-init,并将直接转向systemd,我想政策手册会及时更新以引用systemctl。然而,我对此还不确定的是:我应该使用invoke-rc.d而不是service吗?我可以告诉dpkg我对某些文件感兴趣(通过触发器),那么是否有办法告诉dpkg我也对某些服务感兴趣,并让dpkg进行重启/重新加载操作呢?
澄清一下:我并不是在编写init脚本。我提供的是一个带有其他应用程序配置的软件包,比如Puppet、NTP等,所以我在脚本中停止和重新启动相应的服务。
例如,这里有一个关于invoke-rc.dservice的Docker问题。该问题仍然未解决,有一个人,可能是维护者,评论说他们肯定有兴趣以正确的方式解决这个问题 - 显然我们都不确定什么才是正确的方式。(我的问题与该问题无关。)
2个回答

我会继续使用预/后安装脚本, preinst - 此脚本在将软件包从其Debian存档(“.deb”)文件中解压缩之前执行。许多“preinst”脚本会停止正在升级的软件包的服务,直到其安装或升级完成(在成功执行“postinst”脚本后)。 postinst - 一旦从其Debian存档(“.deb”)文件中解压缩foo软件包,此脚本通常会完成所需的任何配置。通常,“postinst”脚本会要求用户输入,并/或警告用户,如果他接受默认值,则应记住根据情况重新配置该软件包。许多“postinst”脚本然后执行任何必要的命令以启动或重新启动服务,一旦安装或升级了新软件包。
请参阅- https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html 调用start|stop|restart的语法是以条件语句的形式编写的,请参见https://www.debian.org/doc/debian-policy/ch-opersys.html第9.3.3.2节“运行initscripts”。
如果invoke-rc.d命令可用,则执行invoke-rc.d package命令;否则,执行/etc/init.d/package命令。
所以...
if which service >/dev/null 2>&1; then
        service package <action>
elif which invoke-rc.d >/dev/null 2>&1; then
        invoke-rc.d package <action>
else
        /etc/init.d/package <action>
fi

并在需要时为systemd添加另一个条件 ;)
所以是的,启动|停止|重启服务的正确方式是使用适当的包装脚本(invoke-rc.d / system),如果可能的话,而不是调用init脚本(/etc/init.d/package)并在没有可用的包装脚本时回退到/etc/init.d脚本。

基本上,这回答了我大部分的疑问,只剩下一个。invoke-rc.d 的手册和 Debian 政策文档告诉我们要与 /etc/init.d/ 脚本一起使用它(可能是因为它们仍在使用 sysv-init)。那么在 Upstart 或 systemd 中会有什么变化呢? - muru
更新您的问题或发布一个链接到您正在阅读的信息。我在man页面中没有看到任何关于打包的内容。我想这取决于您的服务和init脚本(是upstart?systemd?)。您正在askubuntu.com上提问,而ubuntu使用upstart,因此请参考http://askubuntu.com/questions/58404/how-to-start-and-stop-a-service。如果您的软件包使用旧的init脚本,则现在应该将其转换为upstart,并在长期运行中使用systemd。 - Panther
我已经更新了问题。 - muru
对于问题“这取决于”,没有简单或单一的答案。这是一个暂时的情况,因为Ubuntu和Debian将来都会使用systemd。在Debian(或Ubuntu)上使用invoke-rc.d来处理使用sysv-init的服务,而在Ubuntu上使用service来处理使用upstart的服务。这是脚本编写,所以如果需要,可以发挥创造力,例如invoke-rc.d ... || service ... - Panther
我以为你在问是否应该使用预/后安装脚本,而不是你的脚本的语法。 - Panther
这是两者兼而有之的情况 - 我想可能有一些我没有注意到的界面,而且不想陷入一个XY问题的局面。 - muru
不,如果你看一下,他们在脚本中写了条件 - https://www.debian.org/doc/debian-policy/ch-opersys.html 第9.3.3.1节 管理链接 "if which invoke-rc.d ... else ... /etc/init.d/package <action> ..." 所以 if which service ... elif which invoke-rc.d ... else ... - Panther
Ubuntu政策手册在这个部分基本上是Debian手册的逐字复制。我应该在某个地方提交一个错误报告以寻求澄清,还是等待Debian更新他们的手册? - muru
提交错误报告不会有任何损失。 - Panther


1请提供有关如何使用deb-systemd-invoke的更多信息。 - Cynplytholowazy