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

使用GitHub部署SpringBoot应用:GitHub Action无法终止的问题求助

解决GitHub Action执行nohup启动SpringBoot后无法终止的问题

你的问题核心在于appleboy/ssh-action会维持SSH连接直到所有脚本命令的输出流完全结束,而默认的nohup java -jar ... &虽然把进程放到后台,但nohup会默认将输出写入nohup.out,SSH会话会一直等待这个进程的输出,导致Action卡住无法终止。

给你几个可行的解决办法:

方法1:重定向nohup输出到/dev/null

将启动命令修改为:

nohup java -jar target/*.jar > /dev/null 2>&1 &
  • > /dev/null:把标准输出(stdout)丢弃到"黑洞"设备
  • 2>&1:把错误输出(stderr)重定向到标准输出,跟着一起丢弃
    这样进程的所有输出都不会留在当前SSH会话中,SSH会判定命令执行完成,主动断开连接,GitHub Action就能正常结束。

方法2:用disown让进程彻底脱离会话

在nohup命令后追加disown:

nohup java -jar target/*.jar &
disown

disown会把后台进程从当前shell的作业列表中移除,SSH会话结束时不会关联这个进程,同时也不会等待它的输出,自然就能正常关闭。

额外优化:处理kill命令的潜在报错

你的脚本里kill -9 $(lsof -t -i:8080)如果8080端口没有进程,会抛出错误,虽然不影响部署,但可能干扰SSH会话的状态。可以改成:

kill -9 $(lsof -t -i:8080) 2>/dev/null

2>/dev/null会把错误输出丢弃,避免不必要的日志干扰。

修改后的完整Workflow示例

name: Backend Deployment to Linux VM
on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    name: Backend Deployment to Linux VM
    runs-on: ubuntu-latest

    steps:
      - name: update and start project
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          password: ${{ secrets.PASSWORD }}
          script: |
            kill -9 $(lsof -t -i:8080) 2>/dev/null
            cd /home/github_deploy_backend/backend-P2cinema
            git pull
            mvn clean package
            nohup java -jar target/*.jar > /dev/null 2>&1 &

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:35:24