为什么这个rc.d脚本没有发生chdir?

时间:2017-01-06 04:41:23

标签: freebsd rc rc.d

我试图了解为什么${name}_chdir变量不适合我。最后,让我的脚本与-xv一起运行后,我发现在我的情况下甚至没有运行 cd 命令。这是我的剧本:

#!/bin/sh
set -xv
exec 1>/tmp/awning.rclog 2>&1

# REQUIRE: NETWORKING LOGIN DAEMON
# KEYWORD: shutdown

. /etc/rc.subr

name="awning"
rcvar="awning_enable"
awning_chdir="/usr/sbin/awning"

pidfile="/var/run/awningd.pid"
procname="daemon"

# -f flag is to redirect stdin/stdout/stderr to /dev/null to prevent node from crashing
# on system-startup
start_cmd="/usr/sbin/daemon -r -P ${pidfile} -f -u pierre /usr/sbin/awning/intro.js"
command="/usr/sbin/daemon -r -P ${pidfile} -f -u pierre /usr/sbin/awning/intro.js"
load_rc_config $name
run_rc_command "$1"

起初我只使用start_cmd,但后来我在rc.subr中读了以下内容:

  

$ {名称} _chdir

        Directory to cd to before running _command_, if
        ${name}_chroot is not provided.

所以我想也许事情变得混乱,所以我添加了command=....位,并删除了start_cmd=....行,但仍然没有成功。以下是使用-xv运行脚本而保存的输出的相关“doit”部分:

+ _chdir=/usr/sbin/awning _chroot='' _nice='' _user='' _group='' _groups='' _fib='' _env='' _prepend='' _login_class=daemon _oomprotect=''
+ [ -n '' ]
+ [ -z yes ]
+ [ start '!=' start ]
+ [ -n awning_enable -a start '!=' rcvar -a start '!=' stop -a start '!=' describe ]
+ checkyesno awning_enable
+ eval '_value=$awning_enable'
+ _value=YES
+ debug 'checkyesno: awning_enable is set to YES.'
+ return 0
+ [ start '=' start -a -z yes -a -n '' ]
+ eval '_cmd=$start_cmd' '_precmd=$start_precmd' '_postcmd=$start_postcmd'
+ _cmd='/usr/sbin/daemon -r -P /var/run/awningd.pid -f -u pierre /usr/sbin/awning/intro.js' _precmd='' _postcmd=''
+ [ -n '/usr/sbin/daemon -r -P /var/run/awningd.pid -f -u pierre /usr/sbin/awning/intro.js' ]
+ _run_rc_precmd
+ check_required_before start
+ local _f
+ return 0
+ [ -n '' ]
+ check_required_after start
+ local _f _args
+ return 0
+ return 0
+ _run_rc_doit '/usr/sbin/daemon -r -P /var/run/awningd.pid -f -u pierre /usr/sbin/awning/intro.js '
+ debug 'run_rc_command: doit: /usr/sbin/daemon -r -P /var/run/awningd.pid -f -u pierre /usr/sbin/awning/intro.js '
+ eval '/usr/sbin/daemon -r -P /var/run/awningd.pid -f -u pierre /usr/sbin/awning/intro.js '
+ /usr/sbin/daemon -r -P /var/run/awningd.pid -f -u pierre /usr/sbin/awning/intro.js
+ _return=0
+ [ 0 -ne 0 ]
+ return 0
+ _run_rc_postcmd
+ [ -n '' ]
+ return 0
+ return 0

_chdir设置正确,但它从未用于任何事情。老实说,看起来这些变量(_chdir_chroot等)实际应该是awning_chdirawning_chroot等...

可能会发生什么?

我正在运行版本11.0-RELEASE-p2

1 个答案:

答案 0 :(得分:0)

在单步执行 /etc/rc.subr 之后,我学会了(强硬的) command = 需要字面上的单个命令。对它进行了测试([ ! -x $command ]),即使对于带有选项和无参数的命令也会失败。我不得不将我传递的选项daemon和它的单个参数/usr/sbin/awning/intro.js拆分为一个单独的变量: command_args = ,这解决了这个问题。