Bash脚本中无法同时启动Gunicorn与Celery求助
解决Gunicorn与Celery无法同时启动的Shell脚本问题
两种写法的核心错误
方式一的问题
- 使用
exec命令会直接替换当前Shell进程,启动Gunicorn后,当前进程变为Gunicorn,后续的Celery启动命令、echo等代码完全不会被执行。 &&是串行执行逻辑,只有前序命令执行完成且返回成功时才会执行后续命令,但Gunicorn默认是前台运行,会一直占用当前进程,永远不会走到Celery启动的代码行。
方式二的问题
($cmd)会在子Shell中执行Gunicorn,而Gunicorn前台运行会阻塞当前Shell,导致后续的Celery启动代码永远无法被触发执行。
修正后的脚本写法
要同时启动两个长期运行的服务,需要将它们放到后台运行,避免阻塞Shell的执行流程:
echo "Current project directory: ${PWD}" # 启动Gunicorn并放入后台运行 gunicorn project.wsgi:application \ --name audit_tool \ --bind 0.0.0.0:8000 \ --timeout 1000 \ --workers 4 \ --log-level=$level \ --env DEBUG=${DEBUG} \ --log-config tmp.conf \ --preload & # 记录Gunicorn的进程ID,方便后续管理(可选) GUNICORN_PID=$! echo "Gunicorn started with PID ${GUNICORN_PID}" # 启动Celery并放入后台运行,同时重定向日志到文件方便排查错误(可选) celery -A project worker -Q celery --loglevel=info --concurrency=1 --max-memory-per-child=25000 > celery.log 2>&1 & CELERY_PID=$! echo "Celery started with PID ${CELERY_PID}" # 让主Shell等待所有后台进程,避免Shell退出时杀死子进程 wait
额外排查建议
- 验证Celery命令正确性:确保
-A project指向正确的Celery实例,比如项目根目录下是否存在celery.py文件,或者project/__init__.py中是否定义了Celery对象。 - 查看Celery错误日志:通过重定向日志到文件(如上述脚本中的
> celery.log 2>&1),检查启动时是否有依赖缺失、配置错误等信息。 - 确认环境一致性:确保当前Shell的Python环境与项目运行环境一致,已安装所有依赖(包括Celery)。
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

