【Jenkins】Jenkins nohup执行失败

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

问题描述

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

原因分析

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

具体使用方式如下:

shell 复制代码
# 使用方法一
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
shell 复制代码
# 使用方法二
# 注意:经测试,对于存在自定义参数的情况(比如引用时使用:${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等
            }
        }
    }
}

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

相关推荐
Voyager_46 分钟前
StringRedisTemplate 和 RedisTemplate 的区别是什么?
java·spring boot
杏花春雨江南7 分钟前
JavaWeb企业级项目实战:从SSH到SSM演进 + MQ/Redis/ES高可用架构落地全复盘(实战干货+避坑指南)
java·jvm·spring
UR的出不克11 分钟前
使用 Python 爬取 Bilibili 弹幕数据并导出 Excel
java·python·excel
短剑重铸之日37 分钟前
《7天学会Redis》特别篇: Redis分布式锁
java·redis·分布式·后端·缓存·redission·看门狗机制
独自破碎E1 小时前
说说Java中的反射机制
java·开发语言
一直都在5721 小时前
SpringBoot3 框架快速搭建与项目工程详解
java·开发语言
子云之风1 小时前
LSPosed 项目编译问题解决方案
java·开发语言·python·学习·android studio
小北方城市网1 小时前
SpringBoot 全局异常处理与接口规范实战:打造健壮可维护接口
java·spring boot·redis·后端·python·spring·缓存
南烟斋..1 小时前
嵌入式系统(51单片机)核心外设详解:UART通信与DS18B20温度采集
linux·运维·网络
e***98571 小时前
跨平台虚拟机网络故障排查指南
运维·网络