【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

相关推荐
無限進步D7 分钟前
Java 面向对象高级 接口
java·开发语言
逸Y 仙X38 分钟前
文章二十七:ElasticSearch ES查询模板(Search Template)高效复用实战
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
二哈赛车手1 小时前
新人笔记---Spring AI的Advisor以及其底层机制讲解(涉及源码),包含一些遇见的Spring AI的Advisor缺陷问题的解决方案
java·人工智能·spring boot·笔记·spring
AC赳赳老秦1 小时前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
两年半的个人练习生^_^1 小时前
Java日志框架和使用、日志记录规范
java·开发语言·开发规范
pq2172 小时前
最简单的理解synchronized锁升级
java
杨凯凡2 小时前
【032】排查入门:jstack、heap dump、Arthas 初识
java·开发语言·后端
pq2172 小时前
Spring FactoryBean源码解析
java·spring boot·spring
其实防守也摸鱼2 小时前
无线网络安全--实验 规避WLAN验证之发现隐藏的SSID
java·开发语言·网络·安全·web安全·智能路由器·无线网络安全
中科三方2 小时前
输入域名后无法访问?教你快速区分域名解析问题与服务器问题
运维·服务器