使用Supervisor启动Django生产环境Celery报错:no such file
嘿,我来帮你排查这个app-celery: ERROR (no such file)的问题,通常是这几个环节出了状况,咱们一个个来核对:
检查配置文件的完整性
你贴出来的app-celery.conf里,stdout_logfile的内容是截断的,比如应该写成stdout_logfile=/var/log/supervisor/celery.log,同时建议补充stderr_logfile参数(比如stderr_logfile=/var/log/supervisor/celery_err.log),确保日志路径完整且有效。另外要确认配置文件没有语法错误,所有参数都书写完整,不能有半截内容。验证Celery命令的路径是否正确
先确认/home/app/bin/celery这个文件真的存在——如果你的Celery是装在虚拟环境里的,路径很可能是/home/app/venv/bin/celery(这里的venv是你的虚拟环境目录名,可能叫别的)。你可以直接在终端执行ls /home/app/bin/celery看看能不能找到这个文件,或者手动运行完整的Celery命令:/home/app/bin/celery worker -A draft1 --loglevel=INFO如果手动运行也报错,那说明路径或者项目配置有问题,先把这个命令调通再说。
让Supervisor重新加载配置
你刚在/etc/supervisor/conf.d里加了新的配置文件,Supervisor不会自动感知到,必须先执行这两个命令:sudo supervisorctl reread sudo supervisorctl update执行完之后再尝试启动:
sudo supervisorctl start app-celery,很多时候这个步骤被漏掉就会报“no such file”。检查目录和权限
- 确认
directory=/home/app/draft1这个路径确实存在,终端执行ls /home/app/draft1验证一下。 - 检查
/var/log/supervisor目录是否存在,并且运行Celery的用户(建议在配置里加上user=app参数,指定用app用户运行)有读写这个目录的权限。如果日志目录不存在,先创建它:sudo mkdir -p /var/log/supervisor && sudo chown app:app /var/log/supervisor
- 确认
补充必要的配置参数
一个完整的Celery Supervisor配置通常还需要这些参数,你可以补充到app-celery.conf里:[program:app-celery] command=/home/app/bin/celery worker -A draft1 --loglevel=INFO directory=/home/app/draft1 numprocs=1 stdout_logfile=/var/log/supervisor/celery.log stderr_logfile=/var/log/supervisor/celery_err.log autostart=true autorestart=true startsecs=10 user=app这里的
autostart和autorestart能保证Celery在服务器重启后自动运行,user指定运行用户避免权限问题。
按照上面的步骤排查下来,应该能解决这个“no such file”的问题啦。
内容的提问来源于stack exchange,提问作者Zorgan

