【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

相关推荐
序属秋秋秋19 小时前
《Linux系统编程之进程基础》【进程入门】
linux·运维·c语言·c++·进程·系统编程·fork
大飞哥~BigFei19 小时前
RabbitMq消费消息遇到的坑
java·rabbitmq·java-rabbitmq
隐形喷火龙19 小时前
Springboot集成OnlyOffice
java·spring boot·后端
晨非辰19 小时前
【数据结构】排序详解:从快速排序分区逻辑,到携手冒泡排序的算法效率深度评测
运维·数据结构·c++·人工智能·后端·深度学习·排序算法
5pace19 小时前
【SSM|第一篇】MyBatisPlus
java·spring boot·后端·mybatis
橘子真甜~19 小时前
C/C++ Linux网络编程4 - 解决TCP服务器并发的方式
linux·运维·服务器
last demo19 小时前
Linux 逻辑卷管理
linux·运维·服务器
JosieBook19 小时前
【SpringBoot】37 核心功能 - 高级特性- Spring Boot 中的 自定义 Starter 完整教程
java·spring boot·后端
羑悻的小杀马特19 小时前
SSH级知识管理:通过CPolar暴露Obsidian vault构建你的知识API服务,实现跨设备无缝同步
运维·ssh·cpolar·obsidian