使用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
相关产品推荐
相关产品推荐

