Celery工作进程在命令行正常但在虚拟环境中作为守护进程不正常

2 投票
1 回答
2358 浏览
提问于 2025-04-17 22:03

系统信息

操作系统: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 个回答

2

我最后成功搞定了这个问题,方法是使用了supervisor,并在[program:celery]的环境选项中设置了环境变量。

撰写回答