为什么这个 rc.d 脚本不使用 chdir?
Why isn't chdir happening for this rc.d script?
我在试图理解为什么 ${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 ""
起初我只使用 start_cmd
,但后来我在 rc.subr 中读到以下内容:
${name}_chdir
Directory to cd to before running _command_, if
${name}_chroot is not provided.
所以我想也许事情变得混乱了,所以我添加了 command=....
位,并删除了 start_cmd=....
行,但仍然没有成功。这是输出的相关“doit”部分,它是使用 -xv
:
从 运行ning 脚本中保存的
+ _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_chdir
、awning_chroot
等...
可能发生了什么?
我运行宁版本 11.0-RELEASE-p2
在逐步完成 /etc/rc.subr 之后,我了解到(艰难的方式)command= 需要字面意思是一个命令。对它进行了测试 ([ ! -x $command ]
),即使是带有选项但没有参数的命令也会失败。我不得不将传递的选项 daemon
及其单个参数 /usr/sbin/awning/intro.js
拆分为一个单独的变量:command_args=,这解决了问题。
我在试图理解为什么 ${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 ""
起初我只使用 start_cmd
,但后来我在 rc.subr 中读到以下内容:
${name}_chdir
Directory to cd to before running _command_, if ${name}_chroot is not provided.
所以我想也许事情变得混乱了,所以我添加了 command=....
位,并删除了 start_cmd=....
行,但仍然没有成功。这是输出的相关“doit”部分,它是使用 -xv
:
+ _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_chdir
、awning_chroot
等...
可能发生了什么?
我运行宁版本 11.0-RELEASE-p2
在逐步完成 /etc/rc.subr 之后,我了解到(艰难的方式)command= 需要字面意思是一个命令。对它进行了测试 ([ ! -x $command ]
),即使是带有选项但没有参数的命令也会失败。我不得不将传递的选项 daemon
及其单个参数 /usr/sbin/awning/intro.js
拆分为一个单独的变量:command_args=,这解决了问题。