2012-04-20 11 views
15

アップスタートを使って本当に楽しんでいます。私は現在、いくつかのvirtualenvsで異なるgunicornのインスタンスを実行する新興のジョブを持っています。しかし、私がセロリの起動スクリプトのために見つけた2-3の例は、私のためには機能しません。virtualenvでセロリ(django-celery)のUbuntu Upstartジョブを書くには

したがって、次の変数を使用すると、virtualenvでdjango-celeryを実行するUpstartジョブを作成するにはどうすればよいでしょうか。 Djangoのプロジェクトへ

パス:このプロジェクトのvirtualenvのに

/srv/projects/django_project 

パス:

/srv/projects/django_project/settings.py 

/srv/environments/django_project 

セロリの設定へのパスは、Djangoプロジェクトの設定ファイル(ジャンゴ・セロリ)であります

このCeleryインスタンスのログファイルへのパス:

私はcelerybeatとセロリデーモンを実行したい

www-data 

、そう、私は合格したいコマンド:

iamtheuser 

とグループ: この仮想ENV、ユーザーのために

/srv/logs/celery.log 

django-admin.py(またはmanage.py)には:

python manage.py celeryd -B 

これはeですgunicornの仕事が始まった後にスクリプトが始まるとうまくいき、gunicornの仕事が止まると停止します。のは、そのためのファイルがあるとしましょう:

/etc/init/gunicorn.conf 

答えて

17

あなたはいくつかのより多くの設定を追加する必要があるかもしれませんが、これは、私は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 

それは私にとって素晴らしい作品です。

私は醜いように見えますが、それはthis superuser answerに基づいて、特権を持たないユーザーとして起動ジョブを実行するための現在の「適切な」テクニックのようです。

私はvirtualenvの内部で動くようにするためにはもっとやらなければならないと思っていましたが、virtualenvの中のpythonバイナリを呼び出すだけです。

+0

偉大な、私はこれを微調整し、aokを働いています。 – pwalsh

+0

あなたの微調整を追加するといいかもしれません...私はここに私の投稿:http://stackoverflow.com/questions/14275821/how-to-run-celery-as-a-deamon-in-production/16470913#16470913 –

0

私の作業環境は、Ubuntu 16.04 LTSで動作する新しいシステムを使用しています。セロリはvirtualenvにあります。アプリケーションはPython/Flaskです。

にsystemdファイル:/etc/systemd/system/celery.service

あなたはユーザーとパスを変更したいと思います。

[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 

環境(上記参照)ファイル:/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" 

自動的/usr/lib/tmpfiles.dでファイルを作成し、ユーザーに正しい権限でログインし、実行フォルダを作成します。再起動時に/var/run/celeryフォルダが削除されてしまい、セロリが正常に起動できないという問題がありました。

マイ/usr/lib/tmpfiles.d/celery.confファイル:

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

を有効にするには:sudo systemctl enable celery.service

は今、あなたは/var/log/celery/var/run/celeryフォルダが作成されるため、システムを再起動する必要があります。 /var/log/celeryのログを調べることで、リブート後にセロリが起動したかどうかを確認することができます。

セロリを再起動するには:sudo systemctl restart celery.service デバッグ:tail -f /var/log/syslogとエラーが何かを確認するためにセロリを再起動してみてください。それはバックエンドや他のものに関連する可能性があります。

希望すると便利です。

関連する問題