【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

相关推荐
坚持每天敲代码几秒前
【教程】2025 IDEA 快速创建springboot(maven)项目
java·spring boot·maven
MrSYJ1 分钟前
别告诉我你还不会OAuth 2.0授权过滤器:OAuth2AuthorizationEndpointFilter第二篇
java·微服务·架构
华纳云IDC服务商2 分钟前
美国服务器连接速度变慢时应该着重做哪些检查?
运维·服务器
智星云算力3 分钟前
服务器安装vnc服务端
运维·服务器
运维行者_14 分钟前
做 DevOps 还在被动救火?这篇让你把监控玩成 “运维加速器”!
运维·服务器·devops·服务器监控·容器监控·网络管理·智能运维
王富贵QAQ24 分钟前
Jenkins-Ansible部署discuz论坛
运维·ansible·jenkins
shelterremix24 分钟前
Integer缓存池
java·开发语言
Doris_LMS32 分钟前
在Linux系统中安装Jenkins(保姆级别)
java·linux·jenkins·ci
LDM>W<37 分钟前
EasyMeeting-注册登录
java·腾讯会议
本就是菜鸟何必心太浮1 小时前
python中`__annotations__` 和 `inspect` 模块区别??
java·前端·python