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

时间:2013-12-13 23:47:27

标签: debian init

我一直在尝试设置一个脚本,以便在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几乎可以回答我的问题,但似乎甚至没有遵循“必需 - 开始”依赖关系。

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

2 个答案:

答案 0 :(得分:7)

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

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

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

一旦我的LSB标头遵循这种语法,我就可以运行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.

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

答案 1 :(得分:0)

展开MtWoRw's answer ...

在LSB标头中添加依赖项时,请确保依赖项与依赖项init脚本的“提供:”字段中的标识符匹配,而不是 /中依赖项脚本的名称等/ init.d中

我试图在 avahi-daemon 之后启动 mpd 。在Raspbian中, avahi-daemon init脚本“提供:avahi”。 insserv失败抱怨必须在mpd之前启用avahi-daemon,直到我将LSB标头更改为使用 avahi,而不是 avahi-daemon。