非同期タスクに Celery 3.1.7 を使用する Django 1.6.2 アプリケーションがあります。Supervisor を使用して Celery ワーカーを起動しています。Debian 7.8 サーバーを再起動したとき以外は、今のところすべて正常に動作しています。再起動すると、サーバーが再起動したときに、Celery ログ ファイルの所有権が「celery」ユーザーから「root」に変更されるため、Celery ワーカーは再起動しません。また、pid ファイルを書き込む /run/celery ディレクトリがシステムによって削除されます。これらの変更を手動で行い、Celery を再起動すると、すべてのワーカーが正常に起動します。
これらの変更はワーカーを起動する前に実行する必要があるため、解決策としては、優先度が高いため、celery ワーカー コマンドの前に supervisor.conf スクリプトから実行されるシェル スクリプトを作成すると考えました (以下を参照)。
しかし、このセットアップスクリプトは実行されません。スーパーバイザーログには次のように表示されます。
exited: celery-setup (exit status 0; not expected)
gave up: celery-setup entered FATAL state, too many start retries too quickly.
また、stdout/err ログファイルにはエラーは書き込まれません。
私の質問は次のとおりです:
これは、Celery ワーカーを再起動する前に、ワーカー ログのアクセス許可を変更し、pid ディレクトリを再作成するための正しいアプローチですか?
これが正しいアプローチであるなら、なぜうまくいかないのでしょうか? うまくいかない場合、正しいアプローチは何でしょうか?
スーパーバイザーの代わりにinit.d celerydデーモンスクリプトを使用する場合、CELERY_CREATE_DIRSユーザー/グループが所有する pid およびログ ディレクトリを自動的に作成する設定です。 supervisord を使用するときにこの設定を複製する方法はありますか?
一方では、Supervisor はフォアグラウンド プロセスでのみ使用する必要があることはわかっていますが、このスクリプトではそうではありません。一方、ここで他の質問を見ましたが、それによると、Supervisor からシェル スクリプトを実行できるはずだと思われます。
ご協力いただきありがとうございます。
# celery-supervisor-setup
#!/bin/bash
for i in 1 2 3
do
if [ -f "/var/log/celery/worker${i}.log" ]; then
echo "processing $i"
chown celery:celery /var/log/celery/worker${i}.log
fi
done
if [ ! -d "/run/celery" ]; then
mkdir /run/celery
chown celery:celery /run/celery
fi
# /etc/supervisor/conf.d/supervisor.conf
[program:celery-setup]
command = /www/myproj/conf/celery-supervisor-setup
; This next command didn't work
;command = bash -c " /www/myproj/conf/celery-supervisor-setup"
user = root
stdout_logfile = /var/log/celery_setup_stdout.log
stderr_logfile = /var/log/celery_setup_stderr.log
redirect_stderr = true
autostart = true
autorestart = false
priority=997
[program:celeryw1]
command=/home/myproj/venv/myproj/bin/celery worker --app=conf.celeryapp:app -n worker1 --config=celeryconfig -Q default --loglevel=info --pidfile=/var/run/celery/worker1.pid
directory=/www/myproj
user=celery
numprocs=1
stdout_logfile=/var/log/celery/worker1.log
stderr_logfile=/var/log/celery/worker1.log
redirect_stderr=true
autostart=true
autorestart=true
startsecs=1
stopwaitsecs=600
killasgroup=true
priority=998
; Note that I have "celeryw2" and "celeryw3" subprocess groups that are similar
; to the above except they refer to workers 2 and 3. I omitted them to save space.
[group:celery-workers]
programs=celeryw1,celeryw2,celeryw3
priority=999