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
解释一下,上面这段程序分三个部分:
- 判断输入的jar包名是不是空的,是空的就结束
- 将jar包拷贝到我们的
hadoop-slave1服务器
上 - 执行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`
我解释一下上面其实一共做了以下几个工作:
- 打开当前目录,如果远程执行,这个步骤必须有
- 获取当前正在运行的服务jar包名称
- 如果步骤2没有获取到jar包名称,代表没有运行的服务直接跳到步骤6
- 如果步骤2获取到了jar包名称则获取这个进程的id
- 杀掉正在运行的进程,并将旧的jar服务备份
- 启动新的服务jar包,新的服务jar就是从跳板机传过来的那个
- 查询服务是否已启动
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 运行程序
优点:
-
用户不需要去寻找程序在系统中的位置(因为在不同的系统,命令或程序存放的位置可能不同),只要程序在你的$PATH中;
-
它会根据你的环境寻找并运行默认的版本,提供灵活性。
缺点:
- 不好的地方是,有可能在一个多用户的系统中,别人在你的$PATH中放置了一个bash,可能出现错误。
大部分情况下,/usr/bin/env是优先选择的,因为它提供了灵活性,特别是你想在不同的版本下运行这个脚本;而指定具体位置的方式#! /usr/bin/bash,在某些情况下更安全,因为它限制了代码注入的可能。