2012-04-20 32 views
15

Tôi thực sự thích sử dụng mới nổi. Tôi hiện đang có các công việc mới nổi để chạy các cá thể gunicorn khác nhau trong một số virtualenv. Tuy nhiên, 2-3 ví dụ tôi tìm thấy cho các kịch bản Celery mới nổi trên mạng nội bộ không hoạt động đối với tôi.Làm thế nào để viết một công việc Upstart Ubuntu cho cần tây (django-cần tây) trong một virtualenv

Vì vậy, với các biến sau, tôi sẽ viết công việc Upstart để chạy django-cần tây trong virtualenv như thế nào.

Đường dẫn đến dự án Django:

/srv/projects/django_project 

Đường dẫn đến virtualenv của dự án này:

/srv/environments/django_project 

Đường dẫn đến các thiết lập cần tây là Django thiết lập dự án tập tin (django-cần tây):

/srv/projects/django_project/settings.py 

Đường dẫn đến tệp nhật ký cho trường hợp Celery này:

/srv/logs/celery.log 

Đối env ảo này, người dùng:

iamtheuser 

và nhóm:

www-data 

Tôi muốn chạy Cần tây Daemon với celerybeat, vì vậy, lệnh Tôi muốn vượt qua đến django-admin.py (hoặc manage.py) là:

python manage.py celeryd -B 

Nó sẽ là e tốt hơn nếu kịch bản bắt đầu sau khi công việc gunicorn bắt đầu, và dừng lại khi công việc gunicorn dừng lại. Hãy nói rằng các tập tin cho điều đó là:

/etc/init/gunicorn.conf 

Trả lời

17

Bạn có thể cần thêm một số cấu hình hơn, nhưng đây là một kịch bản mới nổi tôi đã viết cho bắt đầu django-cần tây như một người dùng cụ thể trong một virtualenv:

start on started mysql 
stop on stopping mysql 

exec su -s /bin/sh -c 'exec "$0" "[email protected]"' user -- /home/user/project/venv/bin/python /home/user/project/django_project/manage.py celeryd 

respawn 

Nó hoạt động tuyệt vời cho tôi.

Tôi biết rằng nó trông xấu xí, nhưng nó có vẻ là kỹ thuật 'thích hợp' hiện tại để chạy các công việc mới nổi như người dùng không có đặc quyền, dựa trên this superuser answer.

Tôi nghĩ rằng tôi sẽ phải làm nhiều hơn để làm cho nó hoạt động bên trong virtualenv, nhưng gọi nhị phân python bên trong virtualenv là tất cả phải mất.

+0

Tuyệt vời, tôi đã tinh chỉnh điều này và nó đang hoạt động. – pwalsh

+0

có thể là tốt đẹp để thêm tinh chỉnh của bạn ... Tôi đăng của tôi ở đây: http://stackoverflow.com/questions/14275821/how-to-run-celery-as-a-deamon-in-production/16470913#16470913 –

0

Đây là cấu hình làm việc của tôi bằng cách sử dụng hệ thống mới hơn chạy trên Ubuntu 16.04 LTS. Cần tây là trong một virtualenv. Ứng dụng là một Python/Flask.

Systemd file: /etc/systemd/system/celery.service

Bạn sẽ muốn thay đổi người sử dụng và đường dẫn.

tập tin
[Unit] 
Description=Celery Service 
After=network.target 

[Service] 
Type=forking 
User=nick 
Group=nick 
EnvironmentFile=-/home/nick/myapp/server_configs/celery_env.conf 
WorkingDirectory=/home/nick/myapp 
ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \ 
    -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \ 
    --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}' 
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \ 
    --pidfile=${CELERYD_PID_FILE}' 
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \ 
    -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \ 
    --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}' 

[Install] 
WantedBy=multi-user.target 

Môi trường (tham chiếu ở trên): /home/nick/myapp/server_configs/celery_env.conf

# Name of nodes to start 
# here we have a single node 
CELERYD_NODES="w1" 
# or we could have three nodes: 
#CELERYD_NODES="w1 w2 w3" 

# Absolute or relative path to the 'celery' command: 
CELERY_BIN="/home/nick/myapp/venv/bin/celery" 

# App instance to use 
CELERY_APP="myapp.tasks" 

# How to call manage.py 
CELERYD_MULTI="multi" 

# Extra command-line arguments to the worker 
CELERYD_OPTS="--time-limit=300 --concurrency=8" 

# - %n will be replaced with the first part of the nodename. 
# - %I will be replaced with the current child process index 
# and is important when using the prefork pool to avoid race conditions. 
CELERYD_PID_FILE="/var/run/celery/%n.pid" 
CELERYD_LOG_FILE="/var/log/celery/%n%I.log" 
CELERYD_LOG_LEVEL="INFO" 

Để tự động tạo ra các bản ghi và thư mục chạy với các điều khoản chính xác cho người dùng của bạn, tạo ra một tập tin trong /usr/lib/tmpfiles.d. Tôi đã gặp sự cố với thư mục /var/run/celery bị xóa khi khởi động lại và sau đó cần tây không thể khởi động đúng cách.

/usr/lib/tmpfiles.d/celery.conf tập tin của tôi:

d /var/log/celery 2775 nick nick - 
d /var/run/celery 2775 nick nick - 

Để kích hoạt: sudo systemctl enable celery.service

Bây giờ bạn sẽ cần phải khởi động lại hệ thống của bạn cho /var/log/celery/var/run/celery thư mục được tạo ra. Bạn có thể kiểm tra xem cần tây bắt đầu sau khi khởi động lại chưa bằng cách kiểm tra nhật ký trong /var/log/celery.

Để khởi động lại cần tây: sudo systemctl restart celery.service Gỡ lỗi: tail -f /var/log/syslog và thử khởi động lại cần tây để xem lỗi là gì. Nó có thể liên quan đến phụ trợ hoặc những thứ khác.

Hy vọng điều này sẽ hữu ích!

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