Jekins 自启动Java应用的Shell笔记

     背景

        最近在研究jdk 的jvisualvm 对JVM服务远程监控时,意外的与jekins接轨了。公司使用jekins自动从Git上获得源码,打包后传到测试服务器并启动jar包,实现自动部署,而我需要做的是在测试服务器启动jar包时添加几个我设置的命令,因此不得不花功夫研究了下集成在jekins里的shell命令。之前对这方面的知识积累的比较浅薄(可以说是毫无积累),正好趁着这个机会,我好好熟悉一下shell脚本。(PS:以下脚本全都是公司的胡大佬无偿提供给大家学习参考的,趁他没发现之前,友友们赶紧学起来!)

     实践

        1、首先,我们来看jekins配置。在“构建触发器中”,构建时执行的命令如下:

cd ${WORKSPACE}
echo "开始构建: leixi-test"
sleep 2
bash ./deploy.sh

        这个命令一目了然,本质上是在执行包里的./deploy.sh脚本,那么我们来看看deploy.sh脚本。

        2、编写deploy.sh

        这是从项目中拷出来的deploy.sh脚本,是胡大佬一行行敲出来的,大概是怕我们这群菜鸡看不懂,他给每一行都加了注释。通过脚本和注释可以看出,jekins执行这个脚本主要的作用是打包,然后把包传到测试服务器上。至于在服务器上怎么启动,咱们还得看deploy.sh中的最后一行里写的update-leixi-test.sh。

#########################################################################
# File Name: deploy.sh
# desc: 将jenkins构建的包自动推送到测试服务器,并执行开发服务器上的相关脚本。
# Author: 胡大佬
#########################################################################
# 引入functions,以便在脚本中使用 /etc/init.d/functions 文件中的函数,后面几行均是如此
. /etc/init.d/functions
. /etc/sysconfig/network
. /etc/profile
. /etc/bashrc
# 在当前shell 环境中执行 ~/.bash_profile 文件中的命令
. ~/.bash_profile
# 设置环境变量 SHELL=/bin/bash
export SHELL=/bin/bash
# 开启调试模式
set -x
# 脚本执行出现错误时自动退出脚本
set -e

# 设置变量serverHost 为 10.0.6.183
serverHost=10.0.6.183

# 获取当前脚本的目录路径,赋值给CMD_PATH
CMD_PATH=`dirname $0`
# 输出当前工作目录的路径, echo 是标准输出指令,$PWD指当前路径
echo "current cmd path:$PWD"
# 进入当前脚本目录路径
cd $CMD_PATH

#执行打包操作,跳过单元测试
mvn clean package -DskipTests
#休眠两秒
sleep 2

# 删除旧jar包
rm -rf dist
# 创建dist文件夹,这时候的dist是在当前脚本目录的路径下
mkdir dist

# 复制新jar包到dist文件夹下
cp $CMD_PATH/target/leixi-test.jar ./dist/leixi-test.jar

# 发送jar包到部署机器
cd dist
# 复制jar包到serverHost服务器的www用户下的/opt/www/upload/ 路径下
scp ./leixi-test.jar  www@$serverHost:/opt/www/upload/leixi-test.jar
leixi-test
sleep 2
# 执行脚serverhost服务器的www用户下的update-leixi-test.sh脚本
ssh -t www@$serverHost "/opt/www/update-leixi-test.sh"

        上面的脚本中涉及到两个很重要的操作:往目标服务器发送文件,远程执行目标服务器的脚本,这个在操作时会遇到权限方面的限制,胡大佬给推荐了一个权限配置的教程,大家参考下:

      【Linux】两台机器互发文件scp命令以及配置ssh免密登陆

       

         3、编写update.sh

        这个文件是在测试服务器(我们公司10.0.6.183)上的/opt/www/文件夹下的,各个项目都大同小异,为了让各项目都独立启动,脚本的名字一般会加上项目名用于区分。

#跟上面的脚本一样,引入其他脚本,执行基础命令
. /etc/init.d/functions
. /etc/sysconfig/network
. /etc/profile
. /etc/bashrc
. ~/.bash_profile
export SHELL=/bin/bash

set -e

#设置项目名的变量
var=leixi-test
path=/opt/www

#设置启动时使用的配置文件为dev,启动jar包时会自动使用application-dev.yml
parm=-Dspring.profiles.active=dev


echo "开始更新:$var"


cd $path


# 1、ps -ef|grep -w ${var}.jar 找到leixi-test.jar 的进程 
# 2、grep -v grep 过滤掉 grep命令本身所产生的进程信息
# 3、awk '{print "kill -9 "$2";"}' 找到第2步符合条件的进程id,拼成kill -9 ID的命令
# 4、bash 执行生成的命令 
ps -ef|grep -w ${var}.jar|grep -v grep |awk '{print "kill -9 "$2";"}'|bash

# 递归创建/opt/www/leixi-test目录
mkdir -pv $path/$var
# 将/opt/www/upload下的文件leixi-test.jar拷到/opt/www/leixi-test下面,和上一个脚本接上了
cp ./upload/${var}.jar $path/$var/${var}.jar

cd $path/$var
#执行启动jar包的命令,这是原本的执行方式,为了在visualVm中监控这个服务,这里注释掉了,改用下面的方式。
#nohup java -Xms512m -Xmx512m  $parm -jar ${var}.jar >$path/logs/${var}.log &

# 这是可以通过visualVm监控jar包启动结果的启动方式
# -Xms512m  -Xmx512m 最小内存和最大内存都是512M
# -Dcom.sun.management.jmxremote 是否支持远程JMX访问,默认为true  
# -Dcom.sun.management.jmxremote.port=9999  JMX远程端口号,如果服务器开启了防火墙,需要将端口号配置在白名单里
# -Dcom.sun.management.jmxremote.ssl=false  是否对连接开启SSL加密
# -Dcom.sun.management.jmxremote.authenticate=false 是否需要开启用户认证
# -Djava.rmi.server.hostname=10.0.6.183 监控服务器的主机地址
# -Dcom.sun.management.jmxremote.rmi.port=9999 RMI端口号,与JMX端口号相同
nohup java -Xms512m  -Xmx512m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=10.0.6.183 -Dcom.sun.management.jmxremote.rmi.port=9999  $parm -jar ${var}.jar >$path/logs/${var}.log &

echo "升级 $var 完成"
echo ""

        这里也附上开启端口的命令,在CentOs的系统中,开启防火墙的状态下,可以通过cat /etc/sysconfig/iptables 查看开放的端口号:

        可以修改该文件,按相应的格式在文件中添加内容,或者执行以下命令来开放端口: 

        sudo iptables -A INPUT -p tcp --dport 9999 -j ACCEPT

        (注意,之前在另一个服务器里没找到/etc/sysconfig/iptables文件,我才用的以上命令,但是后来检查过,那个服务器并没有开启防火墙,所以我也不知道这个命令是否有效,有iptables时推荐直接改iptables)

        开放端口后,记得重启下访问控制服务

        /etc/init.d/iptables restart 或 sudo service iptables restart

        4、JVM远程监控

        完成以上步骤后,咱们在jekins上重启服务,再在本地打开[JAVA_HOME]\bin\jvisualvm,配置脚本中写的主机名和端口号,即可监控到远程服务器10.0.6.183上的java应用的运行情况了。具体过程如下:

        4.1、左侧菜单-->远程-->添加远程主机,输入主机IP

        4.2、点击远程主机-->点击JMX连接-->添加端口号

        4.3、监控服务

        以上就是今天分享的全部心得了,码字不易,希望能帮到有需要的家人们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/431497.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【YOLO v5 v7 v8 v9小目标改进】DWRSeg:优化的多尺度处理,传统的深度学习模型可能在不同尺度的特征提取上存在冗余

DWRSeg:优化的多尺度处理,传统的深度学习模型可能在不同尺度的特征提取上存在冗余 提出背景问题:实时语义分割需要快速且准确地处理图像数据,提取出有意义的特征来识别不同的对象。 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔…

超级副业SOP,各行各业,太全了!

最近收集到一份资料,包含了几乎各行各业的SOP,实在是太全了,这里准备分享给大家 这里可能有一些朋友还不知道,SOP是个什么东西呢 百度说法:所谓SOP,是 Standard Operating Procedure三个单词中首字母的大写…

【亲测】注册Claude3教程:解决无法发送手机验证码的问题

Anthropic 今日宣布推出其最新大型语言模型(LLM)系列——Claude 3,这一系列模型在各种认知任务上树立了新的性能标准。Claude 3 系列包括三个子模型:Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus,每个模型都提供…

MATLAB读取.nc(数据集)文件

MATLAB读取.nc(数据集)文件 以中国1km逐月潜在蒸散发数据集(1901-2022)为例 首先用FileZilla下载特定年份的数据集 用matlab进行处理,代码如下: clear;clc;ncdisp("pet_2022.nc") %读数据集的具体信息和变量eva ncr…

LABEL-EFFICIENT SEMANTIC SEGMENTATION WITHDIFFUSION MODELS

基于扩散模型的标签高效语义分割 摘要: 去噪扩散概率模型最近受到了很多研究的关注,因为它们优于gan等替代方法,并且目前提供了最先进的生成性能。扩散模型的优越性能使其成为一些应用程序的吸引人的工具,包括绘图,超…

算法学习02:高精度(c++)

算法学习02:高精度(c) 文章目录 算法学习02:高精度(c)前言一、高精度1.高 高2.高 - 高3.高 * 低4.高 / 低 总结 前言 提示:以下是本篇文章正文内容: 一、高精度 1.高 高 add函数…

走进亚信安慧AntDB:性能与服务的双优选择

AntDB不仅仅是一个简单的数据库系统,它是一项融合了久经验证、多方位支持和高速处理的综合解决方案。在当今数字化时代,数据驱动着各行各业的发展,而AntDB作为一个全面的数据库解决方案,为用户提供了强大的支持和功能。其独特的设…

Java毕业设计 基于SpringBoot 众筹网

Java毕业设计 基于SpringBoot 众筹网 SpringBoot 众筹网 功能介绍 注册 邮箱验证码 登录 忘记密码 首页 图片轮播 关于我们 项目列表 发布项目 我的添加项目 提交审核 已在募捐 项目详情 项目介绍 项目进展 捐赠列表 评论 新闻列表 发布新闻 新闻详情 评论新闻 联系我们 提交…

7.2.2 用坐标表示平移 教案设计及课堂检测设计

【学习目标】 1.掌握坐标变化和图形平移的关系,能用点的平移规律求点平移后的点的坐标. 2.会按要求画出平移后的图形,并写出顶点的坐标.

网上搞钱的方法你知道几个?盘点3个普通人都可操作的赚钱项目

项目一,微头条 我们可以借助精彩的文章,分享知识、心得和见解,吸引更多的读者关注并获得更多的点赞与评论。关键字的巧妙运用将使你的文章更具吸引力和影响力,同时也会为你带来更多的关注度和阅读量。我们写微头条文章的时候&…

01. Nginx入门-Nginx简介

Web基础知识 Web协议通信原理 Web协议通信过程 浏览器本身是一个客户端,当输入URL后,首先浏览器会请求DNS服务器,通过DNS获取相应的域名对应的IP。通过IP地址找到对应的服务器后,监理TCP连接。等浏览器发送完HTTP Request&…

redis10 应用问题(穿透、击穿、雪崩、分布式锁)

思维草图 缓存穿透 查询不存在的数据,穿透redis缓存,请求直接攻击后端db。 问题 当系统中引入redis缓存后,一个请求进来后,会先从redis缓存中查询,缓存有就直接返回(相当于一道隔离闸,保护db…

【打工日常】使用docker部署轻量的运维监控工具

一、Uptime-Kuma介绍 Uptime-Kuma是一个轻量级的自动化运维监控工具,最为引人注目的特点是其出色的监控Dashboard面板。部署简单,工具轻量又强大。而且,Uptime-Kuma是开源免费的,并支持基于Docker的部署方式。它支持网站、容器、数…

【李沐论文精读】Resnet精读

论文地址:Deep Residual Learning for Image Recognition 参考:撑起计算机视觉半边天的ResNet【论文精读】、ResNet论文逐段精读【论文精读】、【李沐论文精读系列】 一、导论 深度神经网络的优点:可以加很多层把网络变得特别深,然…

Java进阶-测试方法

来学习一下软件测试相关的方法,了解一下黑盒测试和白盒测试,以及后面要用到的JUnit单元测试。JUnit单元测试也属于白盒测试,这次内容较少且相对简单。 一、软件测试方法 1、黑盒测试 不需要写代码,给输入值,看程序…

打家劫舍(java版)

📑前言 本文主要是【动态规划】——打家劫舍(java版)的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一…

RT-DETR改进最新LSKNet结构:顶会ICCV2023|原创改进遥感旋转目标检测SOTA!大选择性卷积核的领域首次探索

💡本篇内容:RT-DETR改进最新LSKNet结构:顶会ICCV2023|原创改进遥感旋转目标检测SOTA!大选择性卷积核的领域首次探索 💡🚀🚀🚀本博客 RT-DETR 遥感旋转目标检测SOTA&…

GIS之深度学习10:运行Faster RCNN算法

(未完成,待补充) 获取Faster RCNN源码(开源的很多) 替换自己的数据集(图片标签文件) 打开终端,进入gpupytorch环境 运行voc_annotation.py文件生成与训练文件 E:\DeepLearningMode…

万物皆可模块化分解

引言 为何要模块化,这里的主体是人,客体是事物。当事物很小时,人可以很轻松的解决;但是当事物远大于人能处理的范围时,我们就可以考虑对它进行模块化分解。模块化是一种解决复杂问题的方式,放之四海而皆可…

SPI总线知识总结

1 SPI的时钟极性CPOL和时钟相位CPHA的设置 1.1 SPI数据传输位数 SPI传输数据过程中总是先发送或接收高字节数据,每个时钟周期接收器或发送器左移一位数据。对于小于16位的数据,在发送前必须左对齐,如果接收的数据小于16位,则采用软…