【问题标题】:supervisord environment variables setting up applicationsupervisord 环境变量设置应用程序
【发布时间】:2012-06-08 09:51:33
【问题描述】:

我正在从 supervisord 运行一个应用程序,我必须为它设置一个环境。大约有 30 个环境变量需要设置。我试过把所有东西都放在一个大的

环境=

行,这似乎不起作用。我也尝试了多个 enviroment= 行,但这似乎也不起作用。我也尝试过在 env 值周围使用和不使用 '。

设置我的环境以使其在监督控制下保持不变的最佳方法是什么?我是否应该从预先加载了环境的 shell 脚本调用我的实际程序(龙卷风、fwiw)?理想情况下,我想将所有环境变量放入一个包含文件并使用主管加载它们,但我愿意以另一种方式这样做。

更新:

这是我在 conf 文件中使用的内容:

environment=
    PYTHONPATH=/srv/obsf/current/:$PYTHONPATH,
    PYTHON_EGG_CACHE=/srv/obfs/current/.python-eggs,
    OBFS_API_ENVIRONMENT_STAGE=test,

这持续了大约 30 行,其中包含很多环境变量。当我执行程序时,它立即崩溃并抱怨未设置环境变量 OBFS_API_ENVRIONMENT_STAGE。

【问题讨论】:

  • 我上次使用它时,environment=KEY=val,KEY2=val2 格式有效。您可以粘贴您尝试过的行吗?

标签: python tornado supervisord


【解决方案1】:

relevant documentation section 解释说您需要将变量列为逗号分隔的键/值对:

环境

KEY=val,KEY2=val2 形式的键/值对列表,将放置在 supervisord 进程的环境中(并因此放置在其所有子进程的环境中)。此选项可以包含值 %(here)s,该值扩展为找到 supervisord 配置文件的目录。请注意,子进程将继承用于启动 supervisord 的 shell 的环境变量,除了这里和程序的环境配置节中被覆盖的那些。

example for this section 也使用逗号:

environment = KEY1=value1,KEY2=value2

在内部这是parsed into a dict 使用python shlex lexer,所以它会正确处理引用。它还会去除空格,因此为了使内容更具可读性,您可以将内容分成多行:

environment =
    KEY1="Some longer value containing whitespace",
    KEY2=value2-on-a-new-line,

请注意,尾随逗号是可选的;它不会对输出产生影响。

但是,在 KEY1 之后缺少逗号可能会导致奇怪的值(上面的示例,减去 whitespace" 之后的逗号会给你 {'KEY1': 'Some longer value containing whitespace', '=': ','} 作为环境字典),因为等号要求没有经过严格检查。我已经 submitted a pull request 来解决这个问题。

【讨论】:

  • > 注意尾随逗号是可选的;它不会对输出产生影响。
  • @Hugo:下一行是缩进的吗?下一行没有传递给处理值的代码。我明天再看一遍,但是(Python 标准库)配置解析器的工作方式,你描述的是不可能的。
  • @Hugo:再次查看代码,后面的逗号应该不可能从配置中拉入下一行。您能否向我展示一个演示该行为的示例配置(使用 Gist 或 Pastie)?
【解决方案2】:

事实证明,结尾的逗号是个问题。我引用了所有 env 字符串并删除了尾随逗号。现在一切正常。

【讨论】:

  • 恭喜修复!如果有能力,请确保将您的答案标记为“已接受”,以便其他人能够从您的成功中学习。干杯~
  • 引用我试图添加的 ENV 变量对我有用。谢谢。
  • 确实,尾随逗号将导致下一行算法被解释为环境设置。
猜你喜欢
  • 1970-01-01
  • 2017-11-14
  • 2014-08-05
  • 2016-10-08
  • 2014-08-02
  • 2017-11-13
  • 2012-10-03
  • 1970-01-01
  • 2021-05-27
相关资源
最近更新 更多