为什么启动芹菜时未检测到我的环境变量?

时间:2014-03-31 10:56:35

标签: django rabbitmq celery daemon

我在apache和mod_wsgi服务的centos上运行django。我按照说明设置芹菜作为守护进程运行。

我将此初始化脚本https://github.com/celery/celery/blob/3.1/extra/generic-init.d/celeryd放在/etc/init.d/celeryd

并在

中设置配置
/etc/default/celeryd 

我在django settings.py文件中使用环境变量,因此我可以在开发和生产环境中使用不同的配置。我知道这些环境变量设置正确,因为应用程序一直在工作。我认为芹菜只是没有将变量传递给它或其他东西。

我通过输入env命令进行检查。变量显得很好。

要开始我只是这样做:

service celeryd start

它尝试启动但抛出错误,说我没有设置环境变量。

我写了一个抓取环境变量的函数。这就是引发错误的原因。

def get_env_variable(var_name):
    try:
        return os.environ[var_name]
    except KeyError:
        error_msg = "Set the %s environment variable" % var_name
        raise ImproperlyConfigured(error_msg)

抛出错误的唯一方法是未正确设置环境变量。

有谁知道为什么芹菜没有检测到我设定的环境变量?

4 个答案:

答案 0 :(得分:10)

我刚刚发现我不仅需要在系统中设置环境变量,而且还必须将这些变量传递给/ etc / default / celleryd脚本。

我只是将我的变量放在/ etc / default / celleryd:

的底部
export MY_SPECIAL_VARIABLE = "my production variable"
export MY_OTHERSPECIAL_VARIABLE = "my other production variable"

答案 1 :(得分:2)

如果环境变量写在~/.bashrc上,您可以先将source ~/.bashrc添加到/etc/init.d/celeryd

答案 2 :(得分:1)

您的/etc/default/celeryd是否定义了芹菜应该运行的用户?

在我的手中我有:

CELERYD_USER="celery"
CELERYD_GROUP="celery"

您可以发布/etc/defaults/celeryd配置文件吗?

答案 3 :(得分:1)

我使用celery和supervisor时遇到了同样的问题,我有一个使用shell脚本来启动芹菜工作者并且还获取env变量的超级管理员。

#!/bin/bash

source ~/.profile
CELERY_LOGFILE=/usr/local/src/imbue/application/imbue/log/celeryd.log
CELERYD_OPTS=" --loglevel=INFO --autoscale=10,5 --concurrency=8"
cd /usr/local/src/imbue/application/imbue/conf
exec celery worker -n celeryd@%h -f $CELERY_LOGFILE $CELERYD_OPTS
在〜/ .profile:

export C_FORCE_ROOT="true"
export KEY="DEADBEEF"