【问题标题】:Why can't supervisor find command source为什么主管找不到命令源
【发布时间】:2017-08-21 22:21:18
【问题描述】:

以下是我的supervisor.conf

[supervisord]
nodaemon=true

[program:daphne]
command=source "/opt/ros/indigo/setup.sh" && daphne -b 0.0.0.0 -p 8000 robot_configuration_interface.asgi:channel_layer

[program:worker]
environment=DJANGO_SETTINGS_MODULE="robot_configuration_interface.settings"
command= source "/opt/ros/indigo/setup.bash" && django-admin runworker

这是我得到的错误:

INFO spawnerr:找不到命令“源”

bash 不应该有命令源吗?如果这是使用 sh 我如何强制它运行 bash?

【问题讨论】:

  • . 是符合 POSIX 标准的 source 的同义词。
  • 也就是说,supervisord 在这里根本没有调用 shell。如果这是正确的,并且它是直接执行命令,那么您只是不能在顶层使用 shell 习惯用法和命令。
  • 明确地说,supervisor 使用the Python shlex module 来执行类似shell 的解析。阅读文档和/或源代码应该可以很好地了解它可以做什么和不能做什么。

标签: bash supervisord


【解决方案1】:

Supervisor 根本不启动 shell,bash sh -- 所以它找不到 shell 内置命令也就不足为奇了。如果你需要一个,你必须自己开始一个。因此:

command=/bin/bash -c 'source "$0" && exec "$@"' /opt/ros/indigo/setup.sh daphne -b 0.0.0.0 -p 8000 robot_configuration_interface.asgi:channel_layer

command=/bin/bash -c 'source "$0" && exec "$@"' /opt/ros/indigo/setup.bash django-admin runworker

在这两种情况下,exec 的存在是为了告诉 shell 用它正在执行的进程替换内存中的自身,而不是留下一个除了等待该进程退出之外什么都不做的 shell 实例。

bash -c 之后的第一个参数放在$0 中,之后的第一个参数放在$1 之后;因此,我们可以获取"$0" 并执行"$@" 来引用第一个这样的参数,然后是后面的那些。


来自the docs

supervisord 在运行子进程时不会执行任何 shell,因此 USER、PATH、HOME、SHELL、LOGNAME 等环境变量不会从其默认值更改或以其他方式重新分配。

因此,同样不能期望 shell 操作(包括 &&)在顶层可用。

【讨论】:

    【解决方案2】:

    我也遇到这个问题。

    我找到了更好的解决方案。

    使用source ~/.bash_profile 可能会更好。

    [program: dapi]
    user=pyer
    command=/bin/bash -c 'source ~/.bash_profile  && /usr/local/python3.6/bin/pipenv run python manage.py'
    directory=/data/prd/tools/dapi
    autostart=true
    startretries=1
    stopasgroup=true
    

    如果主管启动的进程创建了子进程,也许可以参考: http://supervisord.org/subprocess.html#pidproxy-program

    【讨论】:

    • 也许更适合您的用例。 OP 明确希望获取不同的 (setup.sh) 程序。 .bash_profile 适用于 login shells——守护进程不是登录 shell——因此它通常包含适合交互使用的内容,而不是服务。
    【解决方案3】:

    尝试通过简单的命令验证Nodejs是否安装成功:

    node -v
    

    如果没有,请安装它,就是这样。 在基于 Debian 的发行版中安装它:

    sudo apt install nodejs
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-24
      • 2017-03-14
      • 2012-12-20
      • 2017-04-29
      • 2019-09-21
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多