我正在为我的应用程序服务器开发二进制 debian 软件包。因此,我需要为它开发 postinst 和 prerm 脚本。我应该在 prerm 中安装新软件包之前停止该服务。我发现我无法使用
service myservice stop
在 prerm 中,我应该使用 invoke-rc.d 而不是它,如下所示
invoke-rc.d myservice stop
这个公共总是失败的:
Invoke-rc.d: initscript myservice, action "stop" failed
当我想安装 deb 包时。我也通过启动对其进行了测试,并且启动操作也遇到了相同的错误。
奇怪的是,当我使用sudo service myservice start/stop
时,服务(myservice
)工作正常,没有任何问题或故障。
谁能解释为什么invoke-rc.d
命令不起作用,但service
命令有效?
很难说没有任何关于脚本性质的信息,但在 invoke-rc.d
和service
下运行之间的主要区别在于
-
invoke-rc.d
尝试检查服务是否应该运行,给定当前运行级别和任何系统 initscript 策略 (/usr/sbin/policy-rc.d
),而service
只是按照你告诉它的那样做; -
service
清除大多数环境变量并将工作目录设置为/,以使执行环境尽可能可重现/可预测。invoke-rc.d
没有。
因此,您可能应该查看当前环境或工作目录或运行级别如何影响 initscript。尝试直接运行它(/etc/init.d/myservice stop
),并尝试使用一些 shell 调试参数运行它(例如,bash 的-x
选项:bash -x /etc/init.d/myservice stop
)。