使用shell脚本完成自动化部署jar包

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" ]; then
 echo "新的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" ]; then
 echo "没有启动的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 $oldId
 do
 kill -9 $id
 echo "killed $id"
 done
 echo "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,在某些情况下更安全,因为它限制了代码注入的可能。

猜你喜欢

转载自blog.csdn.net/u011047968/article/details/107870901