15

私はupstartを使うのが本当に楽しいです。私は現在、いくつかのvirtualenvでさまざまなgunicornインスタンスを実行するためのスタートアップジョブを持っています。ただし、インターウェブ上のCelery upstartスクリプトで見つけた2〜3の例は、私には機能しません。

したがって、次の変数を使用して、virtualenvでdjango-celeryを実行するUpstartジョブをどのように記述しますか。

Djangoプロジェクトへのパス:

/srv/projects/django_project

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

/srv/environments/django_project

セロリ設定へのパスは、Djangoプロジェクト設定ファイル(django-celery)です。

/srv/projects/django_project/settings.py

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

/srv/logs/celery.log

この仮想環境の場合、ユーザーは次のことを行います。

iamtheuser

とグループ:

www-data

celerybeatでCeleryDaemonを実行したいので、django-admin.py(またはmanage.py)に渡すコマンドは次のとおりです。

python manage.py celeryd -B

スクリプトはgunicornジョブの開始後に開始し、gunicornジョブが停止すると停止するとさらに良いでしょう。そのためのファイルが次のようになっているとしましょう:

/etc/init/gunicorn.conf
4

2 に答える 2

16

さらに構成を追加する必要があるかもしれませんが、これは、virtualenvで特定のユーザーとしてdjango-celeryを起動するために作成した起動スクリプトです。

start on started mysql
stop on stopping mysql

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

respawn

それは私にとって素晴らしい働きをします。

見た目が醜いことは知っていますが、このスーパーユーザーの回答に基づくと、非特権ユーザーとしてスタートアップジョブを実行するための現在の「適切な」手法のようです。

virtualenv内で動作させるにはもっと多くのことをしなければならないと思っていましたが、virtualenv内でpythonバイナリを呼び出すだけで十分です。

于 2012-04-20T17:51:10.433 に答える
3

これは、Ubuntu16.04LTSで実行されている新しいsystemdを使用した作業構成です。セロリは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して、エラーを確認します。バックエンドなどに関連している可能性があります。

お役に立てれば!

于 2018-03-05T08:46:00.003 に答える