手把手教你写一个Shell脚本部署你的服务

我们都知道,在开发的过程中,有很多部署自己微服务的方式,其中有各种各样的不同操作,比如使用 Docker 打包为镜像的方式 , 还有基础使用 jar 包的方式进行部署,但是呢?使用 jar 包部署,那就离不开这个启动 jar 包的脚本命令 , 总不能每次都是直接自己手动杀端口,然后再重新启动吧,今天了不起来带大家看一下这个 Shell 脚本,并且写一个 Shell 脚本通用给大家,拿来可用 。
如果想直接拿这个脚本改一下用的,不想看这个基础内容的,可以直接拉到最后了 。
1.查看自己当前系统默认的 Shellecho $SHELL输出:/bin/bash
2.查看系统支持的Shellcat /etc/shells输出:
【手把手教你写一个Shell脚本部署你的服务】/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash
也就是说,我们的云服务器是支持我们在这里给他安排 Shell 脚本的
我们这时候先来安排一下 sh 的文件,创建一个文件夹,然后在其中创建一个 sh 的文件 。
mkdir /usr/local/shelltesttouch test.sh创建完成我们编辑一下内容
vim test.sh#!/bin/bashecho "Hello World Shell"然后我们出来运行一下我们的 Shell 的第一个脚本
bash test.sh出来的结果是 Hello World Shell.
我们知道其实 Shell脚本没那么复杂,一个启动 jar 包的启动,可能用到的用法就一些,我们来看一下另外的几个必备的语法
ifif ...then...else...fi接下来我们看一段脚本,来根据脚本分析
start() {echo ""pid=$(ps -ef | grep $jar_name | grep -v grep | awk '{print $2}')if [ -z $pid ]; thencd $jar_path# 这里转到jar包目录执行命令,是为了使用jar_path下的config文件,貌似JAVA程序只能识别当前执行命令目录下的配置,否则就是使用已打入Jar包的配置文件 。nohup java -jar $jar_name >$log_path 2>&1 &pid=$(ps -ef | grep $jar_name | grep -v grep | awk '{print $2}')echo "应用 ${jar_name}启动成功,pid=${pid}"# tAIl -f $log_pathelseecho "应用 ${jar_name} 正在运行,pid = ${pid}"fiecho ""}start() 顾名思义,这明显就是一个 start 方法,方法体的内容则是花括号内的内容 。
echo 我们都知道了 , 就是输出个内容ps -ef | grep这个命令更不用多说了,那直接就是用来查询应用的端口号的,后面跟着我们的jar_name 实际上就是一个变量,直接获取的我们在方法外面定义的
后面的awk其实就相当于是信息的读入
也就是说 , 我们在执行 sh start.sh start 的方法的时候,然后会读取我们接下来输入的内容,接下来就进入了判断环节 。
cd $jar_path# 这里转到jar包目录执行命令,是为了使用jar_path下的config文件,貌似java程序只能识别当前执行命令目录下的配置 , 否则就是使用已打入Jar包的配置文件 。nohup java -jar $jar_name >$log_path 2>&1 & 这个则是我们最重要的启动Jar包的版本nohup 这个命令的标识则是我们使用后台启动的方式,不必再关注如果执行jar -jar 的时候,我们关闭了当前的窗口,结果我们的服务就被迫终止了,而后面,我们还贴心的又查询了一下这个服务 , 然后把我们的服务是否启动成功给大家展示出来 , 如果运行之后,就会出现 应用xxx启动成功,pid = xxxxx的标志了 。
看完了我们的启动命令,接下来就得看我们的停止命令了 。
stop() {echo ""pid=$(ps -ef | grep $jar_name | grep -v grep | awk '{print $2}')if [ -z $pid ]; then # -z 是判断是否为空echo "${jar_name}未运行!"elseecho "准备关闭进程$pid"kill -9 $pidsleep 0.5echo "${jar_name}已关闭!"fiecho ""}这个stop的方法几句比较简单了,接受收入内容,然后判断这个 jar 包是否在运行当中,如果运行的话,那么找到这个端口,然后关闭到这个进程号,最后给我们输出一个 xxxx已关闭
我们再来看一个重启的方法:
restart() {stopsleep 2echo "停止完成,准备启动jar包"start}这个更不用说了 , 我们写了 start 和 stop  只要在这个 restart里面去执行一下这个 stop 然后等待一会 , 然后再启动就完事了 。
完整的脚本如下
#替换成你的jar包jar_name=cloud-ui-zhiyikeji.jarjar_path=/usr/webjar/log_path=/usr/webjar/logs/`date +%y-%m-%d`_out.log#指向自定义jdk#export JAVA_HOME=/usr/jdk/jdk1.8.0_381#export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar#export PATH=$JAVA_HOME/bin:$PATHstop() {echo ""pid=$(ps -ef | grep $jar_name | grep -v grep | awk '{print $2}')if [ -z $pid ]; then # -z 是判断是否为空echo "${jar_name}未运行!"elseecho "准备关闭进程$pid"kill -9 $pidsleep 0.5echo "${jar_name}已关闭!"fiecho ""}start() {echo ""pid=$(ps -ef | grep $jar_name | grep -v grep | awk '{print $2}')if [ -z $pid ]; thencd $jar_path# 这里转到jar包目录执行命令,是为了使用jar_path下的config文件,貌似java程序只能识别当前执行命令目录下的配置,否则就是使用已打入Jar包的配置文件 。nohup java -jar $jar_name >$log_path 2>&1 &pid=$(ps -ef | grep $jar_name | grep -v grep | awk '{print $2}')echo "应用 ${jar_name}启动成功,pid=${pid}"# tail -f $log_pathelseecho "应用 ${jar_name} 正在运行,pid = ${pid}"fiecho ""}status() {echo ""pid=$(ps -ef | grep $jar_name | grep -v grep | awk '{print $2}')if [ -z $pid ]; thenecho "应用 ${jar_name} 未运行"elseecho "应用 ${jar_name} 正在运行,pid = ${pid}"fiecho ""}restart() {stopsleep 2echo "停止完成 , 准备启动jar包"start}action() {echo "请输入数字选择要执行的操作:1=启动 , 2=重启,3=停止,4=查看运行状态,5=退出"echo '你输入的数字为:'read acase $a in"1")start;;"2")restart;;"3")stop;;"4")status;;"5")exit 1;;*)echo "输入错误,请重新输入"action;;esac}action


推荐阅读