我一直在尝试设置一个脚本,以便在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几乎可以回答我的问题,但似乎甚至没有遵循“必需 - 开始”依赖关系。
如何让我的脚本在启动时运行和遵循给定的依赖项?谢谢!
答案 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。