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

如何让Jenkins Pipeline阶段在数据库导出完成后提前退出

解决Jenkins Pipeline阶段无法退出的问题

问题核心是nohup启动的keep-alive进程没有彻底脱离SSH会话,导致SSH命令一直等待后台进程结束,进而阻塞Pipeline阶段无法进入post步骤。以下是具体修改方案:

修改要点

  1. 彻底脱离SSH会话:给nohup命令添加标准输入、输出、错误的重定向,让进程完全独立于当前SSH会话,避免SSH等待其结束。
  2. 优化远程命令格式:简化SSH的引号嵌套,避免语法错误导致的意外阻塞。

修改后的Pipeline代码

pipeline {
    agent any

    parameters {
        string (name: 'MACHINE_INSTANCE_ID', defaultValue: '', description: 'AWS EC2 Instance ID ', trim: true)
        string (name: 'MACHINE_IP', defaultValue: '', description: 'AWS EC2 IP ', trim: true)
        string (name: 'CB_HOST', description: 'host to backup e.g. "http://somehost.com" ', trim: true)
    }
     stages{

        stage('Start AWS EC2 Instance') {
         steps {
                 sh label: 'Start AWS EC2 Instance', returnStatus: false, script: '''#!/bin/sh

                   aws ec2 start-instances --instance-ids ${MACHINE_INSTANCE_ID}
                   aws ec2 wait instance-running --instance-ids ${MACHINE_INSTANCE_ID}
                   aws ec2 wait instance-status-ok --instance-ids ${MACHINE_INSTANCE_ID}

                   echo "EC2 Instance ${MACHINE_INSTANCE_ID} successfully started!!"
                 '''
           }
        }

        stage('Perform Backup') {
              steps {
                script {
                 sh label: 'Perform Backup', returnStatus: false, script: '''#!/bin/sh
                       ssh -o StrictHostKeyChecking=no -i /var/lib/jenkins/pem ec2-user@${MACHINE_IP} "
                         cd /home/ubuntu/keep-alive
                         echo 'starting keep alive service..'
                         # 重定向所有输出到/dev/null,彻底脱离SSH会话
                         sudo nohup java -jar keep-alive-1.0-SNAPSHOT.jar --places.dbHost=${CB_HOST} > /dev/null 2>&1 &

                         sleep 5

                         cd /home/ubuntu
                         echo '-- Running backup for ${CB_HOST} env'
                         sudo python3 export_new.py -cl ${CB_HOST}
                       "
                     '''
              }
           }
         }
     }

     post {
         always {
           emailext attachLog: false,  mimeType: 'text/plain', subject: "export build ",
                 body: "Job completed..\nSee logs for more info:\n${env.BUILD_URL}/console",
                 to: 'abc.ec@xyz.com'

           sh label: 'Stop AWS EC2 Instance', script: '''#!/bin/sh

             aws ec2 stop-instances --instance-ids ${MACHINE_INSTANCE_ID}
             aws ec2 wait instance-stopped --instance-ids ${MACHINE_INSTANCE_ID}
             echo "EC2 Instance ${MACHINE_INSTANCE_ID} successfully stopped!!"
           '''
         }
       }
}

额外说明

  • 重定向> /dev/null 2>&1将标准输出和错误输出全部丢弃,同时&让进程后台运行,两者结合可以让nohup进程完全脱离当前SSH会话,SSH命令会在导出脚本执行完成后立即退出。
  • 由于后续post步骤会停止EC2实例,keep-alive进程会随实例停止而终止,无需额外手动杀死。如果需要在导出完成后立即终止该进程,可以在python3 export_new.py命令后添加:
    sudo pkill -f "keep-alive-1.0-SNAPSHOT.jar"
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:20:36