Linux(OpenShift/Docker)环境下如何单行执行多条命令部署Django与Celery
单行同时运行Django服务与Celery Worker的实现方法
你之前用&&组合命令无法生效的原因是:python manage.py runserver属于前台阻塞型命令,只有该进程主动退出后,&&后续的命令才会被触发执行,因此Celery进程永远不会启动。
你可以通过后台挂载进程的方式实现需求,正确的单行命令如下:
cd ./app && (python manage.py runserver 0.0.0.0:8000 & celery -A myapp worker --loglevel=info --concurrency=8) && wait
命令逻辑说明
- 首先执行
cd ./app切换到项目工作目录 - 括号内的
python manage.py runserver末尾加&,代表将Django服务放到系统后台运行,执行完该命令后会立刻启动后面的Celery Worker进程 - 末尾的
wait命令会阻塞当前主进程,等待所有后台子进程运行结束,避免OpenShift Pod因为主进程退出被自动销毁
可选优化
如果需要分别保存两个服务的日志,可添加日志重定向配置,示例如下:
cd ./app && (python manage.py runserver 0.0.0.0:8000 > /var/log/django.log 2>&1 & celery -A myapp worker --loglevel=info --concurrency=8 > /var/log/celery.log 2>&1) && wait
注意:该方案仅适用于开发测试场景,生产环境建议将
runserver替换为Gunicorn、uWSGI等生产级WSGI服务器,对进程稳定性要求更高的场景可引入supervisor等进程管理工具替代单行命令。
内容的提问来源于stack exchange,提问作者LiquidDeath
相关产品推荐
相关产品推荐

