systemd 在删除软件包时停止服务

systemd 在删除软件包时停止服务

我已经制作了一个带有服务的 *.deb:

[Unit]
Description=Hello example service
Wants=nginx

[Service]
Type=simple
ExecStart=/usr/local/bin/hello

TimeoutStopSec=15
Restart=always

postinst脚本(除了在安装过程中使用时出现一些错误外,不会影响任何内容:)update-rc.d: error: initscript does not exist: /etc/init.d/hello

update-rc.d hello defaults
invoke-rc.d nginx reload

prerm它的 debian 脚本是:

invoke-rc.d hello stop

此脚本不会停止服务。即使手动启动它也不会起作用。每次都返回 102。

systemctl stop对我的服务来说很好用。

invoke-rc.d网络服务器以某种方式工作:

sudo invoke-rc.d nginx stop

到底是怎么回事?

答案1

invoke-rc.d命令用于 sysv init 脚本(如其手册页所述),而不是 Upstart 或 systemd。Nginx 仍然有一个 sysv init 脚本(init.d文件列表),这可能就是为什么invoke-rc.d它有效(或者无论如何看起来有效)。

尽管 Debian 指南使用invoke-rc.d,但在 Ubuntu 上,更喜欢使用service命令。它是一个包装脚本,可以处理 sysv init、Upstart 和 systemd 文件。

systemd 文档建议使用service

如果您的发行版删除了 SysV init 脚本而使用 systemd 单元文件,则键入/etc/init.d/foobar start启动服务将不起作用,因为脚本将不可用。请使用更正确的 /sbin/service foobar start方法,您的命令将被转发到 systemd。请注意,直接调用 init 脚本始终不是最佳选择,因为太多调用者的执行上下文(环境块、umask、资源限制、审计跟踪等)最终被服务继承,并且通过调用 /sbin/service至少可以部分清理这些内容。通过 /sbin/service 调用适用于 SysV 和 systemd 系统。此外,LSB 仅标准化通过调用/sbin/service。(请注意,某些发行版为服务提供了 systemd 单元文件和 SysV 脚本。对于这些服务,调用 init 脚本将按预期工作,并且请求无论如何都会转发到 systemd。)

当然,对于 Ubuntu 来说,service位于/usr/sbin/service

相关内容