Celery-Supervisor:如何重新启动主管工作以使新更新的芹菜任务有效?

时间:2014-11-05 09:41:16

标签: python django celery django-celery supervisor

我的celery服务器有一个正在运行的主管工作。现在我需要向它添加一个新任务,但遗憾的是我的celery服务器命令未配置为自动跟踪这些动态更改。

这是我的芹菜命令:

python manage.py celery worker --broker=amqp://username:password@localhost/our_app_vhost

要重新开始我的芹菜过程,我试过了,

sudo supervisorctl -c /etc/supervisor/supervisord.conf restart <process_name>
supervisorctl stop all
supervisorctl start all
service supervisor restart

但没有找到工作。如何重启?

3 个答案:

答案 0 :(得分:6)

如果要使用supervisorctl管理进程,则应在配置文件中配置supervisorctl,rpcinterface。

以下是配置文件示例。

<强> sample.conf

[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)

[program:my_worker]
command = python manage.py celery worker --broker=amqp://username:password@localhost/our_app_vhost

[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

现在用

启动主管
supervisord -c sample.conf

现在,如果您想重新启动工作人员,可以使用

执行此操作
supervisorctl -c sample.conf restart my_worker

这会重新启动您的工作人员。或者,您也可以删除主管shell,然后重新启动它

sudo supervisorctl -c sample.conf
supervisor> restart my_worker
my_worker: stopped
my_worker: started

注意:

可以选择在Celery中自动重载工作程序

python manage.py celery worker --autoreload --broker=amqp://username:password@localhost/our_app_vhost

这应仅用于开发模式。不建议在生产中使用它。

有关celery docs的更多信息。

答案 1 :(得分:2)

你可以在/etc/supervisor/conf.d/写你的芹菜任务。为像celery.conf这样的芹菜创建一个新的配置文件。

假设你的virtualenv是venv,你的django项目是样本,你的芹菜脚本在_celery.py

该文件应该看起来像

[program:celery]
command=/home/ubuntu/.virtualenvs/venv/bin/celery --app=sample._celery:app worker --loglevel=INFO
directory=/home/ubuntu/sample/
user=ubuntu
numprocs=1
stdout_logfile=/home/ubuntu/logs/celery-worker.log
stderr_logfile=/home/ubuntu/logs/celery-error.log
autostart=true
autorestart=true
startsecs=10

; Need to wait for currently executing tasks to finish at shutdown.
; Increase this if you have very long running tasks.
stopwaitsecs = 600

; When resorting to send SIGKILL to the program to terminate it
; send SIGKILL to its whole process group instead,
; taking care of its children as well.
killasgroup=true

; if rabbitmq is supervised, set its priority higher
; so it starts first
priority=998

编写此主管程序后,您需要运行

如果添加主管程序,请运行此程序 $ sudo supervisorctl reread

  

芹菜:可用

如果添加/更新管理程序,请运行此命令 $ sudo supervisorctl update

  

芹菜:添加了流程组

检查芹菜任务的状态 $ sudo supervisorctl status celery

  

芹菜RUNNING pid 18020,正常运行时间0:00:50

停止芹菜任务 $ sudo supervisorctl stop celery

  芹菜:停了

开始芹菜任务 $ sudo supervisorctl start celery

  芹菜:开始了

重新启动芹菜任务(这会停止并再次启动指定的任务) $ sudo supervisorctl restart celery

  芹菜:停了下来   芹菜:开始了

答案 2 :(得分:1)

如果某些任务正在运行,请重新启动celery,等待其完成。因此需要杀死所有正在运行的进程。 运行以下命令杀死所有芹菜过程:

kill -9 $(ps aux | grep celery | grep -v grep | awk '{print $2}' | tr '\n' ' ') > /dev/null 2>&1

重新启动芹菜:

sudo supervisorctl stop all
sudo supervisorctl start all