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

如何在GitHub Actions中让服务器后台运行以执行测试?

解决GitHub Actions中FastAPI服务后台运行并执行测试的问题

你遇到的核心问题是启动服务的进程占据了当前终端会话,导致后续测试步骤无法执行。nohup没生效大概率是因为没把进程彻底放到后台,或者缺少输出重定向,另外还需要确保服务完全启动后再跑测试。下面给你几个可行的方案:

方案一:完善后台启动命令+等待服务就绪

直接修改Actions里的启动步骤,把进程放到后台并处理输出,然后添加等待服务启动的逻辑:

- name: Start Fastapi service 
  run: |
    nohup make serve > /dev/null 2>&1 &
- name: Wait for service to be ready
  run: |
    until curl -s http://localhost:8000/health; do
      sleep 1
    done

这里假设你的FastAPI有/health健康检查接口,如果没有,也可以用curl -s http://localhost:8000或者根据你的服务端口调整。如果curl没装,也可以用wget --spider http://localhost:8000替代。

方案二:直接在命令行后台启动服务(跳过Makefile)

有时候Makefile的目标会影响后台进程的处理,你可以绕过Makefile,直接在Actions里启动服务:

- name: Start Fastapi service 
  run: |
    nohup python app.py > /dev/null 2>&1 &
- name: Wait for service to be ready
  run: |
    sleep 5  # 简单粗暴的等待,适合测试环境,或者用上面的轮询方式

这种方式减少了Makefile的中间层,更直接可控。

方案三:使用screen创建后台会话

如果上面的方法还是不行,可以用终端复用工具把服务放到独立会话里:

- name: Install screen
  run: sudo apt-get install -y screen
- name: Start Fastapi service in screen
  run: |
    screen -dmS fastapi_service make serve
- name: Wait for service to be ready
  run: |
    until curl -s http://localhost:8000; do
      sleep 1
    done

screen -dmS会创建一个后台会话并执行命令,不会阻塞当前步骤。

关键注意事项

  • 不管用哪种方法,必须添加等待服务就绪的步骤,否则测试启动时服务可能还没完全初始化,导致测试失败。
  • 输出重定向> /dev/null 2>&1很重要,它会把nohup的输出扔到黑洞,避免占用终端输出缓冲区导致进程挂起。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:56:03