哪种情况可以发生 invoke-rc.d 会失败,但服务不会?



我正在为我的应用程序服务器开发二进制 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.dservice下运行之间的主要区别在于

  1. invoke-rc.d尝试检查服务是否应该运行,给定当前运行级别和任何系统 initscript 策略 ( /usr/sbin/policy-rc.d ),而service只是按照你告诉它的那样做;
  2. service清除大多数环境变量并将工作目录设置为/,以使执行环境尽可能可重现/可预测。 invoke-rc.d没有。

因此,您可能应该查看当前环境或工作目录或运行级别如何影响 initscript。尝试直接运行它(/etc/init.d/myservice stop),并尝试使用一些 shell 调试参数运行它(例如,bash 的-x选项:bash -x /etc/init.d/myservice stop )。

最新更新