2015-02-23 7 views
10

Ich habe eine Umgebungsvariable in supervisord:Python Key Fehler bei der Umgebungsvariable in supervisord Einstellung

[program:worker] 
directory = /srv/app/ 
command=celery -A tasks worker -Q default -l info -n default_worker.%%h 
environment=BROKER="amqp://admin:[email protected]:5672//" 

In meinem celeryconfig.py ich dann versuchen, diese Variable wie diese zu lesen.

BROKER = os.environ['BROKER'] 

Aber ich bekomme immer noch den Schlüssel der Fehler unten, warum?

File "/usr/local/lib/python2.7/dist-packages/celery/loaders/base.py", line 106, in import_module 
    return importlib.import_module(module, package=package) 
    File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/srv/app/celeryconfig.py", line 6, in <module> 
    BROKER = os.environ['BROKER'] 
    File "/usr/lib/python2.7/UserDict.py", line 23, in __getitem__ 
    raise KeyError(key) 
KeyError: 'BROKER 

Es ist eine Datei, Dump des ENVs wie in den Kommentaren vorgeschlagen:

{ 
    'SUPERVISOR_GROUP_NAME': 'celery_default_worker', 
    'TERM': 'linux', 
    'SUPERVISOR_SERVER_URL': 'unix: ///var/run/supervisor.sock', 
    'UPSTART_INSTANCE': '', 
    'RUNLEVEL': '2', 
    'UPSTART_EVENTS': 'runlevel', 
    'PREVLEVEL': 'N', 
    'SUPERVISOR_PROCESS_NAME': 'celery_default_worker', 
    'UPSTART_JOB': 'rc', 
    'PWD': '/', 
    'SUPERVISOR_ENABLED': '1', 
    'runlevel': '2', 
    'PATH': '/usr/local/sbin: /usr/local/bin: /sbin: /bin: /usr/sbin: /usr/bin', 
    'previous': 'N' 
} 
+1

Seltsam - das sieht beim ersten Durchgang korrekt aus. Möglicherweise wird es beim Debuggen helfen, "mit open ("/tmp/sellery-environment.txt "," w ") als f: f.write (repr (os.environ))' zu deinem 'selleryconfig.py' hinzuzufügen, Überprüfen Sie dann die '/ tmp/sellery-environment.txt' Datei, um zu sehen, was * in Ihrer Umgebung * ist *? –

+0

Bestätigen Sie die Ausführungsreihenfolge. d. h., ob die Umgebungsvariable BROKER zuerst in 'supervisord:' gesetzt wird oder BROKER zuerst in 'SelleryConfig.py' gelesen wird. Wenn 'CeleryConfig.py' zuerst gelesen wird, dann gibt es kein BROKER, da BROKER in 'supervisord' gesetzt ist:' – Vinkal

+0

Hast du 'supervisord' gesagt, die Änderungen zu übernehmen, oder sonst' supervisord' neu starten? –

Antwort

2

Diese Antwort höchstwahrscheinlich nicht die Ursache, https://stackoverflow.com/a/28829162/1589147 stattdessen auf einem verwandten supervisord Fehlern für Informationen prüfen.

Ich kann Ihren Fehler teilweise reproduzieren. Ich sehe den Fehler nicht, wenn Sellerie im Supervisor läuft. Ich sehe den Fehler, wenn ich versuche, die Aufgabe von einer Umgebung außerhalb des Supervisors auszuführen, in der ich die BROKER Umgebungsvariable nicht festgelegt habe. celeryconfig.py wird sowohl von Sellerie als auch von allem ausgeführt, das versucht, eine Aufgabe auszuführen.

Ich bin nicht sicher, ob dieses Problem genau das ist, was Sie gefunden haben, wenn Sie teilen könnten, wie Sie die Aufgaben ausführen, und wenn diese Ausnahme ausgelöst wird, kann es helfen.

Zum Beispiel, wenn ich versuche, die Aufgabe von ipython auszuführen, wird ein Fehler generiert, der Ihrem Fehler entspricht.

In [1]: from tasks import add 
In [2]: add.delay(2,3) 
... 
    21   if hasattr(self.__class__, "__missing__"): 
    22    return self.__class__.__missing__(self, key) 
---> 23   raise KeyError(key) 
    24  def __setitem__(self, key, item): self.data[key] = item 
    25  def __delitem__(self, key): del self.data[key] 

KeyError: 'BROKER' 

The celeryconfig.py lokal, um eine Verbindung mit dem Sellerie Broker zu etablieren und Backend geladen. Ich kann die Aufgabe nicht ausführen, ohne die Umgebungsvariable BROKER zu setzen.

Wenn ich die Umgebungsvariable vor Ausführung meiner Aufgabe setze, funktioniert der gleiche Code für mich.

In [3]: import os 
In [4]: os.environ["BROKER"] = "broker is set" 
In [5]: add.delay(2,3) 
Out[5]: <AsyncResult: 0f3xxxx-87fa-48d7-9258-173bdd2052ca> 

Hier sind die Dateien, die ich verwendet habe, falls es hilft.

supervisor.conf: supervisord -c supervisor.conf

[unix_http_server] 
file=/tmp/supervisor.sock 

[supervisord] 
loglevel = info 
nodaemon = true 
identifier = supervisor 

[supervisorctl] 
serverurl=unix:///tmp/supervisor.sock 

[rpcinterface:supervisor] 
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface 

[program:worker] 
command=/app/srv/main-env/bin/celery -A tasks worker -Q default -l info -n default_worker.%%h 
environment=BROKER="amqp://admin:[email protected]:5672//" 
directory=/app/srv/ 
numprocs=1 
stdout_logfile=/app/srv/worker.log 
stderr_logfile=/app/srv/worker.log 
autostart=true 
autorestart=true 
startsecs=10 
stopwaitsecs = 600 
killasgroup=true 
priority=998 

celeryconfig.py:

import os 


BROKER = os.environ['BROKER'] 

tasks.py:

from celery import Celery 

app = Celery(
    'tasks', 
    backend='amqp', 
    broker='amqp://admin:[email protected]:5672//') 
app.config_from_object('celeryconfig') 


@app.task 
def add(x, y): 
     return x + y 
+0

Es sieht so aus, als würde 'supervisord' keine Subprozess-Umgebungsvariablen anwenden. –

+0

Ich denke, die Fehler, die Sie erwähnten, sind eine wahrscheinliche Ursache für den gemeldeten Fehler als meine Antwort, weil die Umgebung, die sie anzeigen, zahlreiche Supervisor-Umgebungsvariablen enthält. Würde es Ihnen etwas ausmachen, Ihren Kommentar als Antwort zu posten, damit ich ihn verbessern kann? –

+0

erledigt (.füller.) –