【问题标题】:freebsd rc scripts and the env(1) shebang pattern do not work togetherfreebsd rc 脚本和 env(1) shebang 模式不能一起工作
【发布时间】: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

标签: python shell freebsd rc


【解决方案1】:

命令解释器警告由/usr/src/etc/rc.subr 中的_find_processes() 函数生成。

这样做的原因是,在ps 输出中发现了以解释语言编写的服务,解释器的名称

【讨论】:

    【解决方案2】:

    自己回答了我的问题,但我希望其他人能为后代提供更好的答案

    env(1) 不起作用的原因是它首先需要一个环境,但是 rc 脚本在环境设置之前运行。因此它失败了。看来流行的 env shebang 模式实际上是一种反模式。

    对于command_interpreter 警告,我没有令人信服的答案。

    【讨论】:

    • ps/etc.脚本的输出说python/usr/local/bin/python2?我打赌它说python 并且不匹配是command_interpreter 警告的原因。但这完全是一个疯狂的猜测。
    • 我收到了与操作相同的错误消息。 @EtanReisner 的猜测是正确的。我的解释器是“/usr/local/bin/python”,但我脚本中的 shebang 行是“/usr/bin/env python”,这触发了警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 2018-02-17
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多