2015-02-23 20 views
10

tôi đặt một biến môi trường trong supervisord:Python chính Lỗi khi thiết biến môi trường trong supervisord

[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//" 

Trong celeryconfig.py của tôi sau đó tôi cố gắng đọc rằng biến như thế này.

BROKER = os.environ['BROKER'] 

Nhưng tôi vẫn nhận được lỗi chính bên dưới, tại sao?

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 

Có một bãi chứa tập tin của envs như đề xuất trong các ý kiến:

{ 
    '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

Lạ - điều đó có vẻ chính xác ở lần vượt qua đầu tiên. Có thể nó sẽ giúp gỡ lỗi của bạn để thêm 'với mở ("/tmp/celery-environment.txt "," w ") như f: f.write (repr (os.environ))' vào 'celeryconfig.py' của bạn, sau đó kiểm tra tệp '/ tmp/celery-environment.txt' để xem * là gì * trong môi trường của bạn? –

+0

Xác nhận lệnh thực hiện. ví dụ: kiểm tra xem biến môi trường BROKER có được đặt đầu tiên trong 'supervisord:' hoặc BROKER được đọc đầu tiên trong 'CeleryConfig.py' hay không. Nếu 'CeleryConfig.py' được đọc trước, thì không có sự tồn tại của BROKER như BROKER được đặt trong' supervisord: ' – Vinkal

+0

Bạn có nói' supervisord' nhận các thay đổi hay khởi động lại 'supervisord'? –

Trả lời

2

Câu trả lời này có thể không phải là nguyên nhân gây ra hầu hết, kiểm tra https://stackoverflow.com/a/28829162/1589147 để biết thông tin về một lỗi supervisord liên quan để thay thế.

Tôi có thể tạo lại lỗi của bạn một phần. Tôi không thấy lỗi khi cần tây chạy trong người giám sát. Tôi thấy lỗi khi tôi cố gắng chạy tác vụ từ môi trường bên ngoài người giám sát nơi tôi không đặt biến môi trường BROKER. celeryconfig.py được thực thi bởi cả cần tây và bất cứ thứ gì cố gắng thực thi tác vụ.

Tôi không chắc chắn nếu vấn đề này là chính xác những gì bạn đã đi qua, nếu bạn có thể chia sẻ cách bạn đang thực hiện các nhiệm vụ và khi ngoại lệ được nêu ra nó có thể giúp đỡ.

Ví dụ: nếu tôi cố gắng chạy tác vụ từ ipython lỗi được tạo phù hợp với lỗi của bạn.

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' 

celeryconfig.py được tải cục bộ để thiết lập kết nối với nhà môi giới và chương trình phụ trợ. Tôi không thể thực hiện tác vụ mà không đặt biến môi trường BROKER.

Nếu tôi đặt biến môi trường trước khi thực hiện tác vụ, cùng một mã hoạt động với tôi.

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> 

Đây là các tệp tôi đã sử dụng trong trường hợp nó trợ giúp.

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

Nó trông giống như 'supervisord' không áp dụng các biến môi trường subprocess. –

+0

Tôi nghĩ rằng các lỗi bạn đã đề cập là nguyên nhân có khả năng xảy ra lỗi được báo cáo nhiều hơn câu trả lời của tôi vì môi trường mà chúng hiển thị cho thấy nhiều biến môi trường được cài đặt của người giám sát. Bạn có nhớ gửi bình luận của bạn như là một câu trả lời để tôi có thể upvote nó? –

+0

được thực hiện (.filler.) –

6

Nó trông giống như một lỗi được biết đến trong supervisord:

http://github.com/Supervisor/supervisor/issues/91 (kindof giải quyết)

http://github.com/Supervisor/supervisor/pull/550 (pending)

Trong trường hợp đó, di chuyển đặc tả môi trường của bạn để phạm vi toàn cầu (đối với quá trình supervisord bản thân) có thể là một cách giải quyết có thể chấp nhận.

Cuối cùng, nếu thất bại, hãy bọc celery trong tập lệnh trình bao chấp nhận biến môi trường cụ thể này làm đối số dòng lệnh.

Các vấn đề liên quan