如何在supervisord命令中使用环境变量

16

如何在supervisord命令中使用环境变量?我尝试使用以下命令:

flower --broker=$MYVAR

但是它不能正常工作(变量没有被扩展),所以我尝试使用内联的python脚本:

command=python -c "import os;os.system('flower --broker={0}'.format(os.environ['MYVAR']))"

上述命令可以工作,但是我无法使用supervisorctl stop来终止进程...它会返回"stopped",但实际上进程仍在运行! 我该如何解决这个问题?(我不想将该参数内联)


除非supervisord中有特殊的内置支持,否则您需要一个shell或其他进程来扩展环境变量,例如command=sh -c 'flower --broker="$MYVAR"' - jfs
嗯...为什么如果我在shell中运行"flower --broker=$MYVAR"它就可以工作呢?! - daveoncode
因为shell会扩展它。 - jfs
为什么当supervisord运行我的命令时,它没有扩展呢? :P - daveoncode
2
你可以在不生成shell的情况下运行命令,尝试使用subprocess.call(["echo", "$PATH"])subprocess.call("echo $PATH", shell=True)进行比较。 - jfs
2个回答

19
根据Supervisor文档,你可以通过在命令前缀加上ENV_来访问环境变量,例如:%(ENV_YOUR_VAR)s 参考链接:http://supervisord.org/configuration.html#environment-variables 引用块中说明了字符串表达式将根据字典进行求值,该字典包含以下键:group_name、host_node_name、process_num、program_name、here(supervisord配置文件的目录)以及所有以ENV_为前缀的supervisord环境变量。
但是,根据此提交:https://github.com/Supervisor/supervisor/commit/2d6ca34582a8a07a5dd96ae45ef62cd58a459f4f,此功能是在3.2版本之后添加的。

请注意,14.04中的最新软件包是3.0b2,但需要3.2版本。 - Carson Ip
请注意,您使用 environment=X="value" 指定的变量在配置文件中不可用作 %(ENV_X)s,而只能作为环境变量 $X 在您的命令中使用。 - benzkji

5
我能够在Supervisor命令中使用系统环境变量,像这样: command=php artisan queue:listen --env=%(ENV_APP_ENVIRONMENT)s 如果APP_ENVIRONMENT环境变量是production,则上述命令将扩展为command=php artisan queue:listen --env=production
注意: 在Supervisor配置中,您必须使用ENV_作为前缀来指定系统环境变量,如文档所示

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接