监控程序和环境变量

98

我真的不知道如何让supervisor使用环境变量。

下面是一个配置片段。

[program:htNotificationService]
priority=2
#autostart=true
#autorestart=true
directory=/home/ubuntu/workspace/htFrontEnd/heythat/htsite
command = /usr/bin/python htNotificationService.py -service
stdout_logfile=/var/log/heythat/htNotificationService.log
redirect_stderr=true
environment=PATH=/home/ubuntu/workspace/htFrontEnd/heythat
stopsignal=QUIT
我已经尝试了以下内容:
environment=PATH=/home/ubuntu/workspace/htFrontEnd/heythat
environment=PYTHONPATH=$PYTHONPATH:/home/ubuntu/workspace/htFrontEnd/heythat
environment=PATH=/home/ubuntu/workspace/htFrontEnd/heythat,PYTHONPATH=$PYTHONPATH:/home/ubuntu/workspace/htFrontEnd/heythat

当我启动supervisor时,我会得到以下信息:

htNotificationService: ERROR (abnormal termination)

我可以通过设置Python路径从Shell开始运行,但无法从Supervisor开始运行。在日志中,我收到了一个错误,说找不到某个导入。如果Supervisor能正常工作,这个问题就可以解决了。我甚至已经将路径添加到/etc/environments中,为什么Supervisor不起作用呢?

6个回答

137

2
这些环境变量名称必须在同一个清单文件中吗?还是也可以在Bash中扩展变量名称? - Panshul
1
我不理解你的问题。你指的是哪个清单文件?你能举个例子说明一下你的想法吗? - edibleEnergy
3
所以每个环境变量都以"ENV_"为前缀?有点奇怪。 - Alexander Mills
这些变量有没有提供默认值的方法? - Rakmo

41
在 supervisord 块下的 .conf 文件中,您可以按如下方式添加所有环境变量键值对:
[supervisord]
environment=CELERY_BROKER_URL="amqp://guest:guest@127.0.0.1:5672//",FLASK_CONFIG="TESTING"

[program:celeryd]
command=celery worker -A celery --loglevel=info -P gevent -c 1000

如果您不想硬编码变量,而是希望从操作系统环境中获取它,请按照以下步骤1在bash中执行:

导出环境变量

>> sudo export CELERY_BROKER_URL="amqp://guest:guest@127.0.0.1:5672//"

重新加载Bash

>> . ~/.bashrc

检查环境变量是否设置正确

>> env

现在修改配置文件以读取 - 注意:在环境变量前加上ENV_。

[supervisord]
environment=CELERY_BROKER_URL="%(ENV_CELERY_BROKER_URL)s",FLASK_CONFIG="%(ENV_FLASK_CONFIG)s"

[program:celeryd]
command=celery worker -A celery --loglevel=info -P gevent -c 1000

5
好的答案。这些微小的变化是至关重要的。 - George Silva
请记住,仅依赖环境变量只有在启动supervisord进程时设置了它们才有效。 - villasv
8
无法工作的错误:<class 'xmlrpclib.Fault'>,<Fault 92: "CANT_REREAD:'supervisord.environment' 的格式化字符串'PROJECT_ENV =%(ENV_PROJECT_ENV)s'包含无法扩展的名称('ENV_PROJECT_ENV')。可用名称:ENV_LANG,ENV_PATH,here">:文件:/usr/lib/python2.7/xmlrpclib.py行:800 - wyx
这里也是,对于上面提出的扩展问题有什么解决方案吗? - Simon Melouah
我的配置文件是 `[supervisord] environment=CELERY_BROKER_URL="amqp://guest:guest@127.0.0.1:5672//",FLASK_CONFIG="TESTING"[program:test_process] command=python -u test.py directory=/home/dinesh stdout_logfile=/home/dinesh/test_process_output.txt redirect_stderr=true,而我的 Python 文件是 import time count = 0 while True: count = count + 1 print(str(count) + ". This prints once every 2secs.%(ENV_FLASK_CONFIG)s") time.sleep(2)`。但是变量在我的文件中没有被替换,请帮忙解决。 - dinu0101
你能解释一下你想用 sudo export CELERY_BROKER_URL="amqp://guest:guest@127.0.0.1:5672//" 做什么吗?这似乎会出错或者没有任何作用。 - edibleEnergy

29

这对我有效。请注意每行前面的制表符:

environment=
    CLOUD_INSTANCE_NAME=media-server-xx-xx-xx-xx,
    CLOUD_APPLICATION=media-server,
    CLOUD_APP_COMPONENT=none,
    CLOUD_ZONE=a,
    CLOUD_REGION=b,
    CLOUD_PRIVATE_IP=none,
    CLOUD_PUBLIC_IP=xx.xx.xx.xx,
    CLOUD_PUBLIC_IPV6=xx.xx.xx.xx.xx.xx,
    CLOUD_PROVIDER=c

相同的环境名称可以在另一个应用程序中使用而不会发生值冲突吗? - user9591909

26

我知道这已经很老了,但我刚刚为此苦苦挣扎了数小时,并希望能够帮助下一个遇到类似问题的人。

别忘了在更新后重新加载配置文件。

supervisorctl reread
supervisorctl update

7
如果您是通过软件包安装了Supervisor,请检查使用的Supervisor版本。截至2016年8月份,您将获得版本3.0b2。如果是这种情况,则需要更新更高版本的Supervisor。您可以通过手动安装Supervisor或使用Python的pip来获取最新版本。请确保满足所有依赖项,并进行启动配置,以使supervisord作为服务运行并在系统启动时启动。

0
有时候,我发现使用shell脚本来设置环境更加方便。
所以,不用这样做。
[program:htNotificationService]
priority=2
directory=/home/ubuntu/workspace/htFrontEnd/heythat/htsite
command = /usr/bin/python htNotificationService.py -service
stdout_logfile=/var/log/heythat/htNotificationService.log
redirect_stderr=true
environment=PATH=/home/ubuntu/workspace/htFrontEnd/heythat
stopsignal=QUIT

我可能有这个人在监督者

[program:htNotificationService]
priority=2
directory=/home/ubuntu/runscripts/heythat/htsite
command = htNotificationService.sh 
stdout_logfile=/var/log/heythat/htNotificationService.log
redirect_stderr=true
stopsignal=QUIT

htNotification.sh

#!/usr/bin/env bash

# change to directory
cd /home/ubuntu/workspace/htFrontEnd/heythat/htsite

# export environment variables here   
set -a
PATH=/home/ubuntu/workspace/htFrontEnd/heythat
USER=joe       # if it's needed
HOME=/home/joe # if it's needed
...
set +a

# or alternatively, source a separate environment file
source /home/ubuntu/.envs/htFrontEnd/heythat/htsite/development

# run the program
/usr/bin/python htNotificationService.py -service

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