ワーカーのコードを更新するために新しいビルドを発行しているときに、セロリワーカーを正常に再起動するにはどうすればよいですか?
編集: 私がやろうとしていることは、このようなことです。
- ワーカーが実行されており、おそらく100MBのファイルをS3にアップロードしています
- 新しいビルドが来る
- ワーカーコードに変更があります
- ビルドスクリプトは、ワーカーにシグナルを送信します
- 新しいコードで新しいワーカーを開始します
- 既存のジョブ終了を終了した後にシグナルを受け取ったワーカー。
https://docs.celeryproject.org/en/master/userguide/workers.html#restarting-the-workerによると、HUP信号を送信してワーカーを再起動できます
ps auxww | grep celeryd | grep -v "grep" | awk '{print $2}' | xargs kill -HUP
celery multi start 1 -A proj -l info -c4 --pidfile=/var/run/celery/%n.pid
celery multi restart 1 --pidfile=/var/run/celery/%n.pid
http://docs.celeryproject.org/en/latest/userguide/workers.html#restarting-the-worker
ルートに行く場合はkill
、pgrepで救助してください。
kill -9 `pgrep -f celeryd`
念のために言っておきますが、これは長期的なタスクではなく、残酷に終了してもかまいません。開発中に新しいコードをリロードするだけです。それがより敏感であるならば、私は再起動サービスルートに行きます。
セロリの自動リロードを確認する必要があります
長時間実行されるタスクはどうなりますか?私はこのようにそれが好きです:長時間実行されるタスクは彼らの仕事をするべきです。それらを中断しないでください。新しいタスクのみが新しいコードを取得する必要があります。
ただし、現時点ではこれは不可能です:https: //groups.google.com/d/msg/celery-users/uTalKMszT2Q/-MHleIY7WaIJ
自動スクリプトを使用して-HUPソリューションを繰り返しテストしましたが、約5%の確率で、ワーカーは再起動後に新しいジョブの取得を停止します。
より信頼性の高いソリューションは次のとおりです。
stop <celery_service>
start <celery_service>
これまで何百回も問題なく使用してきました。
Python内から、次を実行できます。
import subprocess
service_name = 'celery_service'
for command in ['stop', 'start']:
subprocess.check_call(command + ' ' + service_name, shell=True)
パーティーに遅れるかもしれません。私が使う:
sudo systemctl stop celery
sudo systemctl start celery
sudo systemctl status celery