在普通的shell环境中,nohup,并且& 某个程序后,会抛到后台执行,在退出当前shell环境后,程序依然可以执行。但是在Jenkins的pipeline中,通过nohup,且使用&之后,step结束后,执行的程序还是会退出,导致程序起不来。

1)export JENKINS_NODE_COOKIE=dontKillMe很重要,pipeline在退出node{}的时候,会默认清理自己发出的每个shell命令,即使使用了nohup。
2)后台执行java程序,一定要加上{-Dhudson.util.ProcessTree.disable=true}这个参数,否则pipeline执行完成后,java也就自动退出了。

整个脚本文件我也放出来吧

#!/bin/bash
set -e# 基础
# export JAVA_HOME=/work/programs/jdk/jdk1.8.0_181
# export PATH=PATH=$PATH:$JAVA_HOME/bin
# export CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarDATE=$(date +%Y%m%d%H%M)
# 基础路径
BASE_PATH=/datadrive/mego/food
# 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下
SOURCE_PATH=/var/lib/jenkins/workspace/food_safety_platform/mego_service/target
# 服务名称。同时约定部署服务的 jar 包名字也为它。
SERVER_NAME=mego_service-0.0.1-SNAPSHOT
# 环境
PROFILES_ACTIVE=prod
# 健康检查 URL
# HEALTH_CHECK_URL=http://127.0.0.1:8078/actuator/health/# heapError 存放路径
HEAP_ERROR_PATH=$BASE_PATH/heapError
# JVM 参数
JAVA_OPS="-Xms1024m -Xmx1024m"
# JavaAgent 参数。可用于配置 SkyWalking 等链路追踪
# JAVA_AGENT=# 备份
function backup() {# 如果不存在,则无需备份if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; thenecho "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份"# 如果存在,则备份到 backup 目录下,使用时间作为后缀elseecho "[backup] 开始备份 $SERVER_NAME ..."# cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jartar cvf /datadrive/mego/$SERVER_NAME-$DATE.tar /datadrive/mego/foodecho "[backup] 备份 $SERVER_NAME 完成"fi
}# 最新构建代码 移动到项目环境
function transfer() {echo "[transfer] 开始转移 $SERVER_NAME.jar"# 删除原 jar 包if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; thenecho "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除"elseecho "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成"rm $BASE_PATH/$SERVER_NAME.jarrm -rf $BASE_PATH/libfi# 复制新 jar 包echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...."cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATHcp -r $SOURCE_PATH/lib $BASE_PATHecho "[transfer] 转移 $SERVER_NAME.jar 完成"
}# 停止
function stop() {echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME"PID=$(ps -ef | grep $SERVER_NAME.jar | grep -v "grep" | awk '{print $2}')# 如果 Java 服务启动中,则进行关闭echo "是否有PID: [$PID]"if [ -n "$PID" ]; then# 正常关闭echo "[stop] $SERVER_NAME.jar 运行中,开始 kill [$PID]"kill -15 $PID# 等待最大 60 秒,直到关闭完成。for ((i = 0; i < 60; i++))dosleep 1PID=$(ps -ef | grep $SERVER_NAME.jar | grep -v "grep" | awk '{print $2}')if [ -n "$PID" ]; thenecho -e ".\c"elseecho '[stop] 停止 $BASE_PATH/$SERVER_NAME.jar 成功'breakfidone# 如果正常关闭失败,那么进行强制 kill -9 进行关闭if [ -n "$PID" ]; thenecho "[stop] $BASE_PATH/$SERVER_NAME.jar 失败,强制 kill -9 $PID"kill -9 $PIDfi# 如果 Java 服务未启动,则无需关闭elseecho "[stop] $BASE_PATH/$SERVER_NAME.jar 未启动,无需停止"fi
}# 启动
function start() {# 开启启动前,打印启动参数echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME.jar"echo "[start] JAVA_OPS: $JAVA_OPS"# echo "[start] JAVA_AGENT: $JAVA_AGENT"# echo "[start] PROFILES: $PROFILES_ACTIVE"# 开始启动# BUILD_ID=dontKillMe nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE &# BUILD_ID=dontKillMe nohup java -server $JAVA_OPS -jar $BASE_PATH/$SERVER_NAME.jar >/dev/null 2>log &source /etc/profileexport JENKINS_NODE_COOKIE=dontKillMecd $BASE_PATHnohup java -Dhudson.util.ProcessTree.disable=true -jar $SERVER_NAME.jar >/dev/null 2>log &echo "[start] 启动 $BASE_PATH/$SERVER_NAME.jar 完成 [$JENKINS_NODE_COOKIE]"
}# 健康检查
function healthCheck() {# 如果配置健康检查,则进行健康检查if [ -n "$HEALTH_CHECK_URL" ]; then# 健康检查最大 60 秒,直到健康检查通过echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查";for ((i = 0; i < 60; i++))do# 请求健康检查地址,只获取状态码。result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"`# 如果状态码为 200,则说明健康检查通过if [ "$result" == "200" ]; thenecho "[healthCheck] 健康检查通过";break# 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试elseecho -e ".\c"sleep 1fidone# 健康检查未通过,则异常退出 shell 脚本,不继续部署。if [ ! "$result" == "200" ]; thenecho "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功";tail -n 10 nohup.outexit 1;# 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。elsetail -n 10 nohup.outfi# 如果未配置健康检查,则 slepp 60 秒,人工看日志是否部署成功。elseecho "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 60 秒";sleep 60echo "[healthCheck] sleep 60 秒完成,查看日志,自行判断是否启动成功";tail -n 50 nohup.outfi
}# 部署
function deploy() {cd $BASE_PATH# 备份原 jarbackup# 停止 Java 服务stop# 部署新 jartransfer# 启动 Java 服务start# 健康检查# healthCheck
}deploy

微信扫一扫:关注我个人订阅号“猿小飞”,更多精彩文章在这里及时发布:

Jenkins pipeline JENKINS_NODE_COOKIE踩坑记录相关推荐

  1. 日常踩坑记录-汇总版

    开发踩坑记录,不定时更新 心得 RTFM 严谨的去思考问题,处理问题 严格要求自己的代码编写习惯与风格 注意 单词拼写 20200207 mybatis plus 自带insert插入异常 sql i ...

  2. 为Jupyter notebook配置R kernel过程及踩坑记录

    为Jupyter notebook配置R kernel过程及踩坑记录 注意:本文为作者安装过程及折腾的过程,内容比较冗杂,如果读者想直接创建一个属于自己的子环境则参考: 如下文章: anaconda下 ...

  3. Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子

    Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子 目录 Python打包工具Pyintealler打包py文件为windows exe文件过程 ...

  4. TVM: Deep Learning模型的优化编译器(强烈推荐, 附踩坑记录)

    本文作者是阿莱克西斯,原载于知乎,雷锋网(公众号:雷锋网)获得授权转载. (前排提醒,本文的人文内容部分稍稍带有艺术加工,请保持一定的幽默感进行阅读) 关注我最近想法的同学应该知道我最近都在把玩 TV ...

  5. 使用Java读取 “Python写入redis” 的数据踩坑记录

    https://my.oschina.net/u/2338224/blog/3061507 使用Java读取 "Python写入redis" 的数据踩坑记录 https://seg ...

  6. osx php7 imagick,[PHP] MacOS 自带php环境安装imagick扩展踩坑记录 | 码农部落

    前言 最近学习yii2,在搭建环境后,发现在访问contact页面时报错,如下: "Either GD PHP extension with FreeType support or Imag ...

  7. vue-i18n使用及踩坑记录

    使用步骤 1. 安装 npm i vue-i18n 2. vue-cli下使用 //1. 引入 vue-i18n import Vue from 'vue' import VueI18n from ' ...

  8. SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题

    SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题 当你开开心心搭建了一个SpringBoot项目,用插件生成了entity.dao. ...

  9. mysql 使用sum limit_mysql踩坑记录之limit和sum函数混合使用问题

    问题复盘 本次复盘会用一个很简单的订单表作为示例. 数据准备 订单表建表语句如下(这里偷懒了,使用了自增ID,实际开发中不建议使用自增ID作为订单ID) CREATE TABLE `order` ( ...

最新文章

  1. HTML学习感想(4)【密码输入框、单选、复选框】
  2. ttl传输中过期的原因_Redis流行的原因
  3. 在将varchar值id转换为int时失败_Python—CAN报文转换工具教程
  4. 计算机专业核心技术,计算机系多媒体核心技术实验室建设专业方案(10页)-原创力文档...
  5. python逐行读取excel_python对execl 处理操作代码
  6. 开源HTML5应用开发框架 - iio Engine
  7. 带你了解FPGA(2)--逻辑设计基础
  8. linux环境知识点备忘录
  9. 编程之美 1.4买书问题常数时间空间解法
  10. MYSQL数据库升级
  11. 基于Java实现的禁忌搜索算法
  12. xp系统dns服务器有问题,xp系统dns错误的恢复方法
  13. 互联网晚报 | 06月03日 星期五 | 步步高回应“即将倒闭”传闻、爱彼迎启动房东/房源迁移计划;抖音宣布与中超联赛达成合作...
  14. 1080 端口被占用
  15. 如何给屏幕设置一个充满全屏幕的背景图片
  16. uniapp日历组件
  17. 阅读笔记-2022-Enhancing Sequential Recommendation with Graph Contrastive Learning
  18. 放弃FD渠道模式 诺基亚中国新攻略
  19. 基于STM32F407使用ADC采集电压实验
  20. 中信期货财务因题专题报告:财务因子之单因子测试

热门文章

  1. 数据分析必备工具书:Python官方中文文档
  2. Pandas基本操作指南-2天学会pandas
  3. 语音社交产品,安全合规“防坑指南”!
  4. 小程序 setData 学问多
  5. django.db.utils.DataError: (1406, Data too long for column 'gender' at row 1)
  6. .net core读取配置文件
  7. 【shell】Linux shell 之 判断用户输入的变量是否为数字
  8. java网络编程之Socket编程
  9. eclipse The current branch is not configured for pull No value for key remote.origin
  10. 某android平板项目开发笔记--自定义sharepreference UI