【问题标题】:How can I set the PATH for supervisord so it finds the executables如何为 supervisord 设置 PATH 以便它找到可执行文件
【发布时间】:2011-11-03 17:33:54
【问题描述】:

我正在尝试设置supervisor.conf。我的一个应用程序需要 node.js,但系统没有安装 node。此外,因为它需要绑定到端口 80,所以它需要以 root 身份运行。如何修改 PATH 变量,以便 supervisord 可以找到 node 可执行文件(位于目录中)并运行 node.js 应用程序。


我正在尝试这样做

[supervisord]
environment=PATH=/path/to/where/node/executable/is

[program:web]
command=node web.js -c config.json

这失败了

2011-08-25 16:49:29,494 INFO spawnerr: can't find command 'node'

【问题讨论】:

    标签: python shell environment-variables supervisord


    【解决方案1】:

    您可以使用 env 在命令中添加它:

    [program:web]
    command=env PATH="/path/to/where/node/executable/is" node web.js -c config.json
    

    似乎环境在某些情况下不起作用。

    【讨论】:

    • 如果您使用的是 bash 脚本或其他在当前 $PATH 上中继的东西,则无法应用此功能。在我的情况下,我需要从 virtualenv 目录中运行哨兵,但它没有工作,但在设置 command=env PATH="/path/to/virtualenv/bin:%(ENV_PATH)s" sentry start 后它工作得很好并且环境 PATH 被保留。
    • 这对我有用!操作系统:Mac OSX 10.9,主管:3.1.3。
    【解决方案2】:

    我开始使用 supervisor(类似于 zenbeni)的一种模式是使用 shell 脚本来启动我正在运行的任何程序,该程序允许设置环境变量等。

    例如

    #!/bin/sh
    export EXAMPLE_VARIABLE=something
    export PYTHONPATH=/something
    export PATH=$PATH:/somewhere/else
    exec python somescript.py
    

    'exec' 的使用很重要。它将 /bin/sh 替换为正在执行的程序,而不是将其作为子程序生成。这意味着周围没有任何额外的进程,并且信号按预期工作。

    与 zenbeni 的方法相比,这种方法的(小)优势在于,在更新环境变量等时,只需重启主管,即不需要重新读取/更新等。如果您遇到与我相同的错误(完全重新启动主管以更新事件侦听器环境变量),则使用事件侦听器时,此优势会更大。

    【讨论】:

      【解决方案3】:

      你可以只设置命令的绝对路径:

      [program:web]
      command=/path/to/where/node/executable/is/node web.js -c config.json
      

      【讨论】:

      • -1 很遗憾,没有回答这个问题。为什么设置 PATH 不起作用和/或如何解决?
      • 问题是“我如何使这项工作”,而不是“为什么它不工作”。答案解决了问题。如果您有更好的想法,请发布您自己的答案
      猜你喜欢
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      • 2019-01-16
      • 2015-01-25
      • 2015-05-19
      • 2015-02-24
      相关资源
      最近更新 更多