我已经制作了一个带有服务的 *.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
。