You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

额外排查建议

  1. 验证Celery命令正确性:确保-A project指向正确的Celery实例,比如项目根目录下是否存在celery.py文件,或者project/__init__.py中是否定义了Celery对象。
  2. 查看Celery错误日志:通过重定向日志到文件(如上述脚本中的> celery.log 2>&1),检查启动时是否有依赖缺失、配置错误等信息。
  3. 确认环境一致性:确保当前Shell的Python环境与项目运行环境一致,已安装所有依赖(包括Celery)。

内容的提问来源于stack exchange,提问作者nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:08:19