Celery工作进程在命令行正常但在虚拟环境中作为守护进程不正常
系统信息
操作系统:Ubuntu 12.04 LTS
框架:Django 1.5.5
编程语言:Python 2.7.3
任务队列:Celery 3.1.9
我在一个使用Vagrant的虚拟机上运行这个(通过Puppet管理),并尝试按照Celery文档中描述的方式设置Celery,让它作为守护进程运行。相关文档可以在这里找到,还有关于Django的设置可以在这里查看。我为这个项目使用了一个虚拟环境,位置在
/home/vagrant/virtualenvs/myproj
实际的项目文件位于
/srv/myproj
我能够在/srv/myproj目录下使用命令行顺利启动worker和beat调度器。
~/virtualenvs/myproj/bin/celery -A app beat
~/virtualenvs/myproj/bin/celery worker -A app
worker和beat都能正常启动,调度的任务也能顺利传递给worker并执行。问题出现在我尝试将它们作为后台进程运行时。我在/etc/init.d/中使用了在Celery的GitHub仓库找到的脚本,并在/etc/default中的celeryd和celerybeat文件中使用了以下配置设置
CELERY_BIN="/home/vagrant/virtualenvs/myproj/bin/celery"
CELERYD_CHDIR="/srv/myproj"
尝试以sudo权限运行服务时
sudo service celeryd start
sudo service celerybeat start
会出现错误信息。我认为这是因为它使用了/usr/lib中的Python,而不是虚拟环境中的Python。出现的错误是“无法导入名称”(这个包在虚拟环境中存在,但在全局环境中不存在,所以我这样推测)。
我还注意到,在“以守护进程方式运行worker”的说明中提到,worker应该以非特权用户身份运行,并且你应该使用multi或--detach命令来启动worker和beat。通过这种方式,我能够启动worker(但不能启动beat),但是所有的.log和.pid文件都在我当前的目录中创建,而不是我在/etc/default/celeryd配置文件中指定的位置。
有没有人有解决方案让Celery在虚拟环境中正常工作?我觉得我离成功很近,但似乎忽略了某个简单的配置部分。
1 个回答
我最后成功搞定了这个问题,方法是使用了supervisor,并在[program:celery]的环境选项中设置了环境变量。