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


10

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

invoke-rc.d手册页

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

摘自《 Debian政策手册》第9章第3.3节

维护人员应使用update-rc.d和invoke-rc.d程序提供的抽象层来处理其程序包脚本中的初始化脚本,例如postinst,prerm和postrm。

...

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

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

需要说明的是:不是在编写初始化脚本。我为程序包提供了其他应用程序的配置,例如Puppet,NTP等,因此我停止并重新启动了脚本中的相应服务。

例如,这里是有关invoke-rc.dvs 的Docker问题service。这个问题仍未解决,只有一个人(可能是维护者)评论说,他们绝对有兴趣以正确的方式进行操作-显然我们俩都不确定那是什么。(我的问题与该问题无关。)

Answers:


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节,运行初始化脚本

如果是哪个invoke-rc.d> / dev / null 2>&1; 然后

invoke-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

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

因此,是的,启动或停止服务的正确方法是,在可能的情况下,使用适当的包装器脚本(invoke-rc.d / system),而不是调用初始化脚本(/etc/init.d/package),然后当没有包装器可用时,回退到/etc/init.d脚本。


除了一个问题,这几乎回答了我的大多数疑问。该invoke-rc.d手册页和Debian政策文件告诉我们,在连接使用/etc/init.d/脚本(可能是因为他们仍然使用SYSV-INIT)。Upstart或systemd的变化如何?
muru

更新您的问题或发布指向您正在阅读的信息的链接。我在手册页上没有看到有关包装的任何内容。我想这取决于您的服务和init脚本(它是upstart吗?systemd吗?),您在askubuntu.com上询问,而ubuntu使用upstart,因此askubuntu.com/questions/58404/how-to-start-and-stop服务。如果您的软件包使用旧的init脚本,则应暂时其转换为upstart,并从长远来看是systemd。
Panther

我已经更新了问题。
muru

对于这个问题,没有简单或单一的答案,因为“取决于”。这是暂时的情况,因为前进ubuntu和debian都将使用systemd。对于Debian(或Ubuntu)上使用sysv-init的服务,应使用invoke-rc.d;对于Ubuntu上使用upstart的服务,应使用service...。它是脚本,因此如果需要则可以发挥创意invoke-rc.d ... || service ...
Panther

我以为您是在问是否应该使用pre / post inst脚本,而不是脚本的语法。
Panther

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.