使用springboot的过程之中难免会遇到一个问题,每次启动项目的jar都要java -jar,命令是又长又难受,每次都要如此是一件很难受的过程。shell脚本的优势顿时就体现出来了,这里就讲解一下一个jar的启动脚本应该怎么写。虽然也可以打包成war但是就体验度来说还是jar来的清洁,此外也不仅仅针对SpringBoot打的jar包,如此写不过是让标题显得更长一点。

 

一、Shell脚本代码

#!/bin/bash
tpid=`cat tpid|awk '{print $1}'`
tpid=`ps -aef|grep $tpid|awk '{print $2}'|grep $tpid`
if [ ${tpid} ];
then
  echo Demo is already running!
else
  rm -f tpid
  nohup java -jar demo-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &
  echo 'Demo Engine server is started.'
  echo $! > tpid
fi

这是整体的代码,下面进行逐条的解释。

 

二、逐条解释

各种linux命令不理解的自行查阅,另外对于管道符号|也需要了解,在此就不做多余的解释了。

tpid=`cat tpid|awk '{print $1}'`

此处的tpid是一个文件,里面主要负责记录所启动的jar的进程id,也就是pid。这里是将文件tpid的第一个字段给提了出来赋给tpid这个变量。awk命令其实是将每一行的第某个字段提取出来,这里tpid文件只有一行且只有一个字段,所以该处命令就是将tpid里的内容取出来。

 

tpid=`ps -aef|grep $tpid|awk '{print $2}'|grep $tpid`

本处的命令是:

ps -aef 将所有进程查出来,得出结果1;

grep $tpid 在结果1的基础上将涉及变量tpid的内容查出来,得出结果2;

awk '{print $2}' 在结果2的基础上将每行的第二个字段提取出来,得出结果3;

grep $tpid 在结果3的基础上查找到与变量tpid一样的值更新tpid的值;

这里解释一下几个疑惑:

Q:既然有了tpid了为何还要一层层的查找?看样子为何不直接跳过这一步?

A:这样做主要是预防一次启动之后,将进程号写进了tpid这个文件之中后手动kill掉了这个进程,那么第二次启动的时候,脚本读取了文件中的字段,若是不经过这一层的校验,那么下一个if判断就会认为脚本已经被启动了。

 

Q:查出所有的进程后按照已有tpid查找其是否存在并获取第二个字段,这里为什么获取第二个字段?为何获取了第二个字段之后还要再grep一下?

A:用ps查看过进程信息的都知道,结果里第二个字段显示的就是进程id,至于为什么将第二个字段拿出来后要在此结果的基础上再查出tpid,是因为上一步查到的结果之中会出现grep命令也占了一个结果。

 

if [ ${tpid} ];
then
  echo Demo is already running!

判断是否不为空。若是tpid的值不为空,那么就证明该进程在运行当中,输出Demo已经运行。

 

else
  rm -f tpid
  nohup java -jar demo-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &
  echo 'Demo Engine server is started.'
  echo $! > tpid

若是上一个if不成立,也就是tpid值为空,那么:

rm -f tpid

删除tpid这个文件。

 

nohup java -jar demo-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &

后台运行的方式启动我们的jar包。

 

echo $! > tpid

将后台运行的最后一个进程的id写进tpid之中,也就是我们上一步运行的jar的对应的进程id。

 

三、总结

熟悉Linux命令编写shell脚本是很简单的,至少对于这种启动脚本而言,有兴趣的可以更深一步了解shell脚本的更多知识。