2015-04-20 131 views
4

我试图找出哪个是启动时运行的服务脚本的名称。之后我需要名称来调用默认脚本。在init.d中获取服务名称

我不能预先假定这个名字,这就是为什么我必须在执行过程中得到它。

NAME=${0##*/} 
SCRIPTNAME=/etc/init.d/$NAME 

# Read configuration variable file if it is present 
[ -r /etc/default/$NAME ] && . /etc/default/$NAME 

我试过型动物办法:

  • 使用$ BASH_SOURCE
  • 使用BASENAME $ 0
  • 使用bash特殊变量$ {0 ## * /}

如果我从shell手动运行脚本而不是在重新启动后运行脚本,它们都可以工作。我想init.d以不同的方式启动进程。

我正在使用Debian Lenny(我知道,相当老...)和bash v3.2.39。如果需要,我打开使用其他类型的shell。

谢谢。

+0

他们各自都失败了?我期望'BASH_SOURCE'失败,因为脚本可能由'/ bin/sh'运行,因此可能没有设置变量。但我期望使用'$ 0'来工作(尽管有一个'S ##'或'K ##'前缀需要处理)。 –

+0

我真的不明白你想要什么。 @EtanReisner是你吗?你能向我解释一下吗? –

+0

谢谢!为了有更好的格式,我回复了一个新的答案。 – RicardoPB

回答

2

我写了一些额外的代码来准确知道每个变量的值,我发现了一个令人兴奋的惊喜。

BASH_SOURCE:/etc/rc2.d/S99iap_FA_iapfa

$ 0:/etc/rc2.d/S99iap_FA_iapfa

$ {0 ## * /}:S99iap_FA_iapfa

瓦尔不为空,但rc符号链接名称。我写了一个简单的解决方法,并且知道它似乎独立工作,它是从rc符号链接或服务本身执行的。

RC_NAME=${0##*/} 
NAME="${RC_NAME#[SK][0-9][0-9]}" 

SCRIPTNAME=/etc/init.d/$NAME 

# Read configuration variable file if it is present 
[ -r /etc/default/$NAME ] && . /etc/default/$NAME 
相关问题