【发布时间】:2015-10-07 14:59:53
【问题描述】:
我有一个 python 脚本,我想在 FreeBSD 中使用 rc(8) 脚本。出于可移植性目的,python 脚本使用#!/usr/bin/env python2 模式。 (不同的 *nix 将解释器二进制文件放在文件系统的不同位置)。
FreeBSD rc 脚本不适用于此。
这是一个设置测试场景的脚本,用于演示:
#!/bin/sh
# Create dummy python script which uses env for shebang.
cat << EOF > /usr/local/bin/foo
#!/usr/bin/env python2.7
print("Hello foo")
EOF
# turn on executable bit
chmod +x /usr/local/bin/foo
# create FreeBSD rc script with command_interpreter specified.
cat << EOF > /usr/local/etc/rc.d/foo
#!/bin/sh
#
# PROVIDE: foo
. /etc/rc.subr
name="foo"
rcvar=foo_enable
command_interpreter="/usr/local/bin/python2.7"
command="/usr/local/bin/foo"
load_rc_config \$name
run_rc_command \$1
EOF
# turn on executable bit
chmod +x /usr/local/etc/rc.d/foo
# enable foo
echo "foo_enable=\"YES\"" >> /etc/rc.conf
下面是一个控制台日志,展示了直接执行 rc 脚本时的行为。请注意,这可行,但会发出警告。
# /usr/local/etc/rc.d/foo start
/usr/local/etc/rc.d/foo: WARNING: $command_interpreter /usr/local/bin/python2 != python2
Starting foo.
Hello foo
#
下面是一个控制台日志,展示了使用 service(8) 命令执行 rc 脚本时的行为。这完全失败了。
# service foo start
/usr/local/etc/rc.d/foo: WARNING: $command_interpreter /usr/local/bin/python2 != python2
Starting foo.
env: python2: No such file or directory
/usr/local/etc/rc.d/foo: WARNING: failed to start foo
#
为什么service foo start 会失败?
为什么 rc 会警告解释器?为什么不使用command_interpreter变量中指定的解释器?
【问题讨论】:
-
我怀疑
$PATH运行时rc的值不同,所以找不到python2。