使用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脚本的更多知识。