文章目录

  • 1.前言
  • 2.跳板机
  • 3.服务器
  • 4.注意事项

1.前言

首先我们这里有一台跳板机,然后有一台服务器,现在的要做的就是将跳板机上的jar包文件,然后通过服务器上的脚本实现旧jar包的备份,新jar包的启动。
使用起来很简单:begin.sh demo-V2.0.jar
实现部署的操作:拷贝jar包到服务器 -> 备份旧服务jar包 -> 启动新服务jar包

2.跳板机

以下代码就是跳板机上的程序begin.sh

#!/bin/sh
fileName=$1
if [ -z "$fileName" ]; then
echo "文件名不能为空"
exit 0
fi
echo "开始拷贝jar文件【$fileName】到hadoop-slave1"
scp $fileName  root@hadoop-slave1:/usr/local/test/
echo "文件传输结束"
ssh root@hadoop-slave1  /usr/local/test/backup-and-start.sh $fileName

解释一下,上面这段程序分三个部分:

  1. 判断输入的jar包名是不是空的,是空的就结束
  2. 将jar包拷贝到我们的hadoop-slave1服务器
  3. 执行hadoop-slave1服务器上的启动脚本backup-and-start.sh

3.服务器

通过上面的跳板机上的代码,我们知道跳板机最终会调用服务器上/usr/local/test/backup-and-start.sh这个shell脚本命令。这个命令的代码如下;

#!/usr/bin/env bash
echo "服务器开始部署服务"
projectname="demo"
#打开文件所属的目录,不然远程执行会找不到当前目录
cd /usr/local/test
#新的jar包会当成参数传过来
newJar=$1
echo "新的jar为:$newJar"
#如果新的jar包为空则退出
if [ -z "$newJar" ]; thenecho "新的jar不能为空"exit 0
fi
#获取旧的jar包名称,当然可能是空的,也可能跟当前名称一致
oldJar=$(ps -ef | grep ${projectname}|grep -v 'backup-and-start.sh'|grep -v grep|awk '{print $10}'|cut -d '/' -f 2)
echo "当前运行的旧的jar包为:$oldJar"
#如果新的jar包为空则退出
if [ -z "$oldJar" ]; thenecho "没有启动的demo服务"
else#如果旧的进程还在就将旧的进程杀掉oldId=`ps -ef|grep ${projectname}|grep -v "$0"|grep -v "grep"|awk '{print $2}'`echo "$oldId"echo "kill old process start ..."for id in $oldIddokill -9 $idecho "killed $id"doneecho "kill old process end"#获取当前时间suffix=".bak-"`date '+%Y%m%d'`;echo $suffix;#将旧的jar包进行备份mv $oldJar ${oldJar}${suffix}
fi
#上面的步骤是杀掉旧的进程,下面开始启动新的进程
nohup java -jar ${1} > ${1}.log 2>&1 &
echo "服务启动查看进程:"
echo `ps -ef | grep ${projectname}|grep -v 'backup-and-start.sh'|grep -v grep`

我解释一下上面其实一共做了以下几个工作:

  1. 打开当前目录,如果远程执行,这个步骤必须有
  2. 获取当前正在运行的服务jar包名称
  3. 如果步骤2没有获取到jar包名称,代表没有运行的服务直接跳到步骤6
  4. 如果步骤2获取到了jar包名称则获取这个进程的id
  5. 杀掉正在运行的进程,并将旧的jar服务备份
  6. 启动新的服务jar包,新的服务jar就是从跳板机传过来的那个
  7. 查询服务是否已启动

4.注意事项

如果是服务器上的脚本/usr/local/test/backup-and-start.sh,使用如下解释头

#!/usr/bin/env bash

来替换原来的解释头

#!/usr/bin/bash

以免出现环境变量问题的报错。

具体的原因如下

#!/usr/bin/env bash #lends you some flexibility on different systems
#!/usr/bin/bash     #gives you explicit control on a given system of what executable is called

通过/usr/bin/env 运行程序
优点:

  1. 用户不需要去寻找程序在系统中的位置(因为在不同的系统,命令或程序存放的位置可能不同),只要程序在你的$PATH中;

  2. 它会根据你的环境寻找并运行默认的版本,提供灵活性。

缺点:

  1. 不好的地方是,有可能在一个多用户的系统中,别人在你的$PATH中放置了一个bash,可能出现错误。

大部分情况下,/usr/bin/env是优先选择的,因为它提供了灵活性,特别是你想在不同的版本下运行这个脚本;而指定具体位置的方式#! /usr/bin/bash,在某些情况下更安全,因为它限制了代码注入的可能。

使用shell脚本完成自动化部署jar包相关推荐

  1. Linux自定义shell脚本一键启停jar包

    Linux运行jar包脚本,我的 jar包和 .sh文件在同一目录. #!/bin/sh port=8090 #端口 jar_name=ruoyi-admin.jar #/usr/local/ry-v ...

  2. Linux(Ubuntu)下设置开机自启shell脚本执行Java程序jar包

    一.建立脚本文件: 二.设置权限 三.将脚本文件放到启动目录下 四.更新优先级 cd /etc/init.d sudo update-rc.d startm.sh defaults 90 至此,开机启 ...

  3. Maven学习总结(48)——利用wagon-maven-plugin插件自动化部署Jar包/war包到Linux远程服务器

    前言: Maven项目可使用mvn package指令打包,打包完成后包位于target目录下,要想在远程服务器上部署,首先要将包上传到服务器.程序开发完成后部署到线上Linux服务器,可能需要经历打 ...

  4. Linux shell脚本启动 停止 重启jar包

    只需将jar文件的路径替换到APP_NAME的值及JAVA_HOME的值就可以了,其他不用改. 注意:window编辑的shell文件,通过WinSCP上传的Linux服务器,需要改变文件的格式(查看 ...

  5. Linux配置脚本导出运行,linux服务器部署jar包以及shell脚本的书写

    背景:记录在linux环境下部署jar程序的过程 1 部署过程记录 1.1 程序结构 这里的main函数就在DemRest2.java 文件中. 为了部署方便,要做到以下两点: 1 在导出的jar包中 ...

  6. jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理

    准备步骤: 1.安装java环境,知道java安装目录 2.将jar包拖放或发送至服务器中(目录自定义) 一.编写shell脚本,将以下代码放在shell脚本中,将shell脚本放在jar包同级目录下 ...

  7. Jenkins部署war包和部署jar包的详细步骤

    目录 零.配置Tomcat 一.自由风格项目远程部署war包 1.创建自由风格项目 2.增加构建步骤 3.增加构建后操作 4.立即构建 5.查看控制台输出 二.创建流水线项目远程部署war包 1.拉取 ...

  8. docker部署jar包的几种方式

    docker部署jar包的几种方式 前言 使用Dockerfile手动打包jar 简单打包运行 进化:可复用容器 究极进化:jdk镜像直接创建可服用容器 超究极进化:maven插件打包(不推荐) 无聊 ...

  9. 通过.sh文件快捷部署jar包到服务器上

    参考博客:https://blog.csdn.net/qq_43382350/article/details/125008727 直接写一个脚本文件,每次运行这个文件就可以通过.sh文件快捷部署jar ...

最新文章

  1. Java的SPI机制
  2. python替换字符串内容
  3. 一文了解物联网主控芯片架构之争
  4. 内存管理[6]测试堆的内存占用情况
  5. 怎么在Caffe中配置每一个层的结构
  6. Python实现-中介者模式
  7. LeTax报错之 Incomplete \iffalse
  8. SIMD via C#
  9. 列举网络芳邻的网络资源
  10. JAVA面试题:你怎么设计一个消息队列?
  11. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_8 Mybatis中的返回值深入-调整实体类属性解决增和改方法的报错...
  12. python复杂网络分析_科学网—复杂网络分析库NetworkX学习笔记(3):网络演化模型 - 闫小勇的博文...
  13. dw添加下拉菜单_Dreamweaver怎么创建下拉菜单
  14. 玩平衡车系列——编码器使用教程与测速原理
  15. 有关java多态性的介绍
  16. 计算机文化基础多选题答案,计算机基础多选题集(附答案)
  17. 记一次微信分享的坑,ios和安卓分享打开的url不一样
  18. 需求预测模型分类与选择
  19. 单光感pid巡线_技术解析——单颜色传感器巡线中的PID控制器
  20. 《CCNA学习指南:Cisco网络设备互连(ICND2)(第4版)》——1.1节理解VLAN 和VLAN Trunk 及排除相关故障...

热门文章

  1. 关于会计科目表,科目组,字段状态组
  2. 2015盘点最佳5笔小投资引援:骑士得枪勇士收肉盾
  3. abap性能优化——利用凭证的number ranger提高abap程序性能
  4. ABAP程序中的七大危险漏洞
  5. java中为什么要用json_Java中使用JSON
  6. html中index.css里面写什么,css中z-index是什么意思?
  7. cytoscape要求的JAVA版本_微生物研究必备:Cytoscape绘制网络图(一)
  8. Python教程:int数值类型的内置函数
  9. python列表各种切片姿势
  10. Python实现switch效果