gpt4 book ai didi

debian - 如何获取 update-rc.d 或 insserv 以遵循依赖项

转载 作者:行者123 更新时间:2023-12-03 19:58:12 25 4
gpt4 key购买 nike

一段时间以来,我一直在尝试设置一个脚本以在 Debian 7.1 系统上启动时运行,但没有成功。我试过同时使用 insserv 和 update-rc.d,但我的问题似乎与任一工具相同。这是我的脚本的 LSB 部分:

#!/bin/bash

### BEGIN INIT INFO
# Provides: start_guest
# Required-Start: $bootlogs $sudo $virtualbox-guest-utils $syslog
# Required-Stop: $bootlogs $sudo $virtualbox-guest-utils $syslog
# Should-Start:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start_guest
### END INIT INFO

使用 update-rc.d,这里是我尝试过的各种命令,所有命令都具有相同的结果:
sudo update-rc.d start_guest defaults
sudo update-rc.d start_guest defaults 22
sudo update-rc.d start_guest start 22 2 3 4 5 . stop 78 2 3 4 5 .

无论我运行哪一个,我都会被告知(仅显示运行级别 2,因为 2、3、4、5 是相同的,而 0、1、6 都是 K01):
insserv: remove service /etc/init.d/../rc2.d/S21rc.local
insserv: enable service ../init.d/rc.local -> /etc/init.d/../rc2.d/S20rc.local
insserv: remove service /etc/init.d/../rc2.d/S21rmnologin
insserv: enable service ../init.d/rmnologin -> /etc/init.d/../rc2.d/S20rmnologin
insserv: enable service ../init.d/start_guest -> /etc/init.d/../rc2.d/S17start_guest

无论我得到什么样的依赖信息,我都无法让它从 S17 以外的地方开始。不幸的是,../rc2.d/S19bootlogs 将在我的脚本之后启动,这将阻止我获取有时关键的日志信息。

当我尝试用 insserv 做同样的事情时,我被告知正常服务已被指示启动我的新服务,但它似乎仍然没有遵循依赖关系排序。在 start_guest 开始运行之前,我需要运行更多的服务(例如 sudo、virtualbox-guest-utils 等)
me@bronze:/etc/init.d# sudo insserv start_guest 
insserv: Service remote_fs has to be enabled to start service start_guest
insserv: Service syslog has to be enabled to start service start_guest
insserv: exiting now!

David Krmpotic's answer to this question几乎回答了我的问题,但似乎也没有遵循“必需启动”依赖项。

如何让我的脚本在启动时运行 遵循给定的依赖关系?谢谢!

最佳答案

事实证明,有三种不同的方法可以将依赖项添加到 LSB header 中,而且解释这些差异的文档很少。对我而言,正确的 LSB header 实际上是这样的:

# Required-Start:       bootlogs sudo virtualbox-guest-utils $syslog
# Required-Stop: bootlogs sudo virtualbox-guest-utils $syslog

(在这两行中,我都可以删除 sudo 和 virtualbox-guest-utils,因为引导日志会强制我的 start_guest 脚本启动最新的脚本。)

一旦我的 LSB header 遵循此语法,我就可以运行 update-rc.d start_guest defaults它完全符合我的要求。

当列出需要在新 init 脚本之前或之后启动或停止的服务时,有几种方法可以列出它们。
  • 使用 $name引用facility service或虚拟服务
  • 使用 name引用一个现有的服务<--我一直需要的
  • 使用 +name引用可选的服务

  • 其中一些在文档中提到过,但不清楚并且在各个部分甚至各种文档之间进行了分解。我遇到的每个例子都只使用了设施服务,不包括任何普通或可选的服务,这导致我在语法上非常困惑。

    从 insserv 的手册页:
    insserv  scans  for  System Facilities in the configuration file /etc/insserv.conf
    and each file in the directory /etc/insserv.conf.d/. Each line which begins with
    $ and a following name defines a system facility accordingly to the Linux Standard
    Base Specification (LSB)

    和:
    Names starting  with a `+' sign are marked as optional.  If the service with the
    name after the plus sign is available it will be used, if not available it
    is ignored silently.

    我不打算问然后回答我自己的问题。一个多月以来,我一直对这个问题感到困惑,虽然我得到了提示,但没有给我一个足够完整的答案,我可以看到它做我需要它做的事情。几周后重新审视事物让我获得了更好的洞察力,即使仍然存在令人费解的问题。

    关于debian - 如何获取 update-rc.d 或 insserv 以遵循依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20577923/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com