• 【Jenkins】Jenkins nohup执行失败


    在使用Jenkins进行构建过程中,对于脚本中的nohup命令没有响应。

    问题描述

    当使用Jenkins调用脚本时,脚本中其它命令比如mv/cp等命令均可以正常执行,但是nohup命令没有任何响应,对于同样的脚本,在Linux本地使用root账号执行时,则可以正常执行。

    原因分析

    结合官方文档以及众多资料可知,Jenkins的nohup是伪后台命令,当当前Pipline中的任务执行完成后,nohup命令执行的内容也会随即退出,为了防止nohup命令退出,可以设置环境变量JENKINS_NODE_COOKIE=dontKillMe

    具体使用方式如下:

    # 使用方法一
    sh '''
       #!/bin/bash
       export JENKINS_NODE_COOKIE=dontKillMe
       # 应用重启
       echo "重启${project_name},端口${project_port}"
       # 根路径
       basePath=/data/data
       logPath=$basePath/logs/${project_name}_log.log
       pidPath=$basePath/pid/${project_name}.pid
       # appPort=8083
       appName=${project_name}.jar
       echo "1. 根据端口号kill进程$appName"
       pid=$(netstat -nlp | grep :${project_port} | awk '{print $7}' | awk -F"/" '{ print $1 }');
       echo "1.1 杀掉对应的进程,如果pid不存在,则不执行"
       if [  -n  "$pid"  ];  then
           kill  -9  $pid;
       fi
       echo "睡眠3s,防止停止任务没有完成"
       sleep 3s
       echo "1.2 移除无效日志文件"
       rm -rf $logPath
       rm -rf $pidPath
       echo "1.3 判断文件是否存在"
       if [ -f "$basePath/apps/$appName" ]; then
           mv $basePath/apps/$appName $basePath/backup/$appName.`date +'%Y%m%d%H%M'`
       fi
       cp ${WORKSPACE}/${project_name}/build/libs/${project_name}.jar $basePath/apps/$appName
       echo "2. 启用进程"
       nohup /data/data/libs/jdk11/bin/java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED  -jar $basePath/apps/$appName  -Dspring.profiles.active=${nacos_group}  --NACOS_GROUP=${nacos_group} --NACOS_SERVER_ADDRESS=${nacos} --SERVICE_NAME=${service_name} > $logPath 2>&1 &
       echo $! > $pidPath
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    # 使用方法二
    # 注意:经测试,对于存在自定义参数的情况(比如引用时使用:${project_name}) ,无法使用下面的方法,会报错,但是方法一没有问题
    pipeline {
        agent any
    
        stages {
            stage('Start Application') {
                steps {
                    script {
                        withEnv(['JENKINS_NODE_COOKIE=dontKillMe']) {
                            // 启动应用的命令,这里以 nohup java -jar 为例
                            sh """
                                nohup java -jar your-application.jar &
                                echo "Application started with PID: $!"
                                sleep 3
                                # 可选:检查进程是否仍在运行,确保启动成功
                                ps aux | grep your-application.jar | grep -v grep
                            """
                        }
                    }
                }
            }
        }
    
        post {
            always {
                script {
                    // 可选:清理或记录操作,如记录启动的PID等
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    参考文档:https://blog.csdn.net/a772304419/article/details/137957716

  • 相关阅读:
    Oracle控制文件control file(1)控制文件概述
    Aria2 for Mac (免HomeBrew)
    简历(快速上手)
    数据挖掘——RFM客户价值模型及航空公司客户分析实例
    基于HMM-Viterbi的通信网络资源数据处理方法及应用
    Collction的List方法,list特有方法,遍历方式,迭代器选择
    基于STM32的温控风扇
    三极管是一项伟大的发明
    蓝桥杯python组--基础训练---2、#一个数如果恰好等于它的因子之和,这个数就称为“完数”,;例如:6=1+2+3,找出1000以内的
    harbor 安装
  • 原文地址:https://blog.csdn.net/seven_zhao/article/details/138133304