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/bashset -e#设置项目名的变量
var=leixi-test
path=/opt/www#设置启动时使用的配置文件为dev,启动jar包时会自动使用application-dev.yml
parm=-Dspring.profiles.active=devecho "开始更新:$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}.jarcd $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.hqwc.cn/news/513599.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode刷题日志-17.电话号码的字母组合

纯暴力解法&#xff0c;digits有多长&#xff0c;就循环多少次进行字母组合 class Solution {public List<String> letterCombinations(String digits) {List<String> reslut new ArrayList<>();if(digits.equals(""))return reslut;Map<Inte…

【一起学习Arcade】(6):属性规则实例_约束规则和验证规则

一、约束规则 约束规则用于指定要素上允许的属性配置和一般关系。 与计算规则不同&#xff0c;约束规则不用于填充属性&#xff0c;而是用于确保要素满足特定条件。 简单理解&#xff0c;约束规则就是约束你的编辑操作在什么情况下可执行。 如果出现不符合规则的操作&#…

三八妇女节送礼推荐:送给她的五款超值好物,绝不踩雷!

随着三八妇女节的临近&#xff0c;我们开始思考如何向身边的女性表达我们的尊重和关爱。这个特殊的节日不仅是对女性贡献的认可&#xff0c;更是展示我们关怀与感激之情的绝佳时机。在众多礼物中&#xff0c;如何挑选一份既能体现心意又实用的礼品呢&#xff1f;为了让您在这个…

MyBatis介绍

MyBatis是一个优秀的持久层框架&#xff08;就是将某些数据持久化到硬盘或其他存储器中的框架&#xff09;&#xff0c;它把jdbc对数据库的操作进行了封装&#xff0c;使用户只需关注sql本身&#xff0c;不需要去执行jdbc的那一套复杂的操作。 MyBatis通过配置xml文件或注解的方…

OWASP Top 10 网络安全10大漏洞——A01:2021-访问控制中断

10大Web应用程序安全风险 2021年top10中有三个新类别、四个类别的命名和范围变化&#xff0c;以及一些合并。 A01&#xff1a;2021-访问控制中断 从第五位上升到top1&#xff0c;94%的应用程序都经过了某种形式的访问控制破坏测试&#xff0c;平均发生率为 3.81%且在贡献的…

每日学习总结20240301

20240301 1. strchr VS strrchr strchr和strrchr是C语言标准库中的字符串处理函数&#xff0c;用于在字符串中查找特定字符的位置。 1.1 strchr函数 strchr函数用于在字符串中查找第一次出现指定字符的位置&#xff0c;并返回该位置的指针。函数原型如下&#xff1a; char…

如何创建一个VUE3项目并使用Element UI插件

1.确保已经安装了Node&#xff1a; win R 打开控制面板&#xff0c;输入“node -v”回车。出现版本号信息&#xff0c;则安装成功&#xff0c;否则请移步安装。 Node.js安装及环境配置&#xff08;简单易懂&#xff01;&#xff09;_building: c:\program files\nodejs\node…

Vue2高级篇

Vue高级 Vue生命周期 生命周期又称为生命周期回调函数、生命周期函数、生命周期钩子, 是Vue在运行过程中的关键时刻帮我们调用的一些指函数, 生命周期函数名字不可修改, 其中的this指向的是vm或组件实例对象. 常用的生命周期钩子: mounted: 发送ajax请求、启动定时器、绑定…

JavaScript观察者模式:实现对象间的事件通信!

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

UOS 20 安装redis 7.0.11 安装redis 7.0.11时 make命令 报错 /bin/sh: cc: command not found

UOS 20 安装redis 7.0.11 1、下载redis 7.0.112、安装redis 7.0.113、启动停止redis 7.0.114、安装过程问题记录 UOS 20 安装redis 7.0.11 安装redis 7.0.11时 make命令 报错 /bin/sh: cc: command not found、zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such fil…

【Redis】Redis 缓存重点解析

Redis 缓存重点解析 推荐文章&#xff1a;【Redis】Redis的特性和应用场景 数据类型 持久化 数据淘汰 事务 多机部署-CSDN博客 1. 我看你的项目都用到了 Redis&#xff0c;你在最近的项目的哪些场景下用到了 Redis 呢&#xff1f; 一定要结合业务场景来回答问题&#x…

数字化转型导师坚鹏:成为数字化转型顾问 引领数字化美好未来

成为数字化转型顾问 引领数字化美好未来 ——数字化人才与企业的共赢之路 数字经济新时代&#xff0c;中国企业向数字化转型要效益&#xff1b; 转型顾问创未来&#xff0c;职场精英借数字化转型成良师。 我们中国政府特别重视数字经济发展及数字化人才培养。早在2020年8月2…