如何让update-rc.d或insserv遵循依赖关系

 Angkaka 发布于 2023-02-10 15:02

我一直在尝试设置一个脚本,在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!

大卫Krmpotic对这个问题的回答几乎可以回答我的问题,但看起来似乎并不是"必需 - 开始"依赖关系.

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

1 个回答
  • 事实证明,有三种不同的方法可以将依赖项添加到LSB标头中,并且很少有文档来解释这些差异.我的目的正确的LSB标题实际上是这样的:

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

    (在这两行中,我可以删除sudo和virtualbox-guest-utils,因为它是bootlogs,强制我的start_guest脚本启动最新的.)

    一旦我的LSB标头遵循这种语法,我就能够运行update-rc.d start_guest defaults并且它完全符合我的要求.

    列出需要在新的init脚本之前或之后启动或停止的服务时,有几种方法可以列出它们.

    使用$name指一个机构的服务或虚拟服务

    使用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.
    

    我不打算问,然后回答我自己的问题.我一直在困惑这个问题超过一个月,虽然我得到了提示,没有什么能给我一个足够的答案,我可以看到它做我需要它做的事情.几周之后重新审视事情会给我提供更好的洞察力,即使仍然存在令人费解的问题.

    2023-02-10 15:05 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有