在软件包安装时重新启动依赖服务的正确方法是什么?

mur*_*uru 10 packaging upstart services systemd 14.04

我正在创建一个配置包,并希望停止并重新启动其配置受到影响的服务。现在我正在使用service [stop|restart]in{pre,post}{inst,rm}方式。我读了一个问题的地方,invoke-rc.d正确的方法,因为它供奉有关服务的用户的喜好。但是,我找不到任何关于此的指南。有谁知道这样的指导方针?或者对我应该选择哪种方式有什么建议?该软件包供内部使用,并且在未来两年内可能仅适用于 14.04。但是,我想为我的继任者留下一个尽可能干净的状态systemd,我也是这么想的。

invoke-rc.d手册页

Debian 软件包的维护者脚本对 init 脚本的所有访问都应通过invoke-rc.d 完成

来自 Debian 政策手册,第 9 章,第 3.3 节

维护者应该使用 update-rc.d 和 invoke-rc.d 程序提供的抽象层来处理包脚本中的 initscripts,例如 postinst、prerm 和 postrm。

...

包维护者脚本必须使用 invoke-rc.d 来调用 /etc/init.d/* initscripts,而不是直接调用它们。

Debian 一直在使用sysv-init,将直接转向systemd,我想政策手册会适时更新以供参考systemctl。但是,我不确定的是:我应该使用invoke-rc.d而不是service吗?我可以说dpkg我对某些文件感兴趣(通过触发器),那么有没有办法告诉dpkg我我也对某些服务感兴趣并开始dpkg重新启动/重新加载?

澄清一下不是在写初始化脚本。我提供了一个包含其他应用程序配置的包,如 Puppet、NTP 等,所以我停止并重新启动脚本中的相应服务。

例如,这里是一个关于invoke-rc.dvs的 Docker 问题service。这个问题仍然悬而未决,一个人,可能是维护者,评论说他们肯定有兴趣以正确的方式做到这一点- 显然我们都不确定那是什么。(我的问题与该问题无关。)

Pan*_*her 5

我会继续使用 pre/post inst 脚本,

preinst - 该脚本在该软件包从其 Debian 存档(“.deb”)文件中解压缩之前执行。许多“preinst”脚本会停止正在升级的包的服务,直到它们的安装或升级完成(在“postinst”脚本成功执行之后)。

postinst - 一旦 foo 从其 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

if which invoke-rc.d >/dev/null 2>&1; 然后

调用-rc.d 包

别的

/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
Run Code Online (Sandbox Code Playgroud)

并在需要时为 systemd 添加另一个条件;)

所以是的,启动|停止|重新启动服务的正确方法是使用适当的包装脚本(invoke-rc.d/system),如果可能,而不是调用初始化脚本(/etc/init.d/package)和当没有包装器可用时,回退到 /etc/init.d 脚本。