目标:想在 springBoot.1.0-SNAPSHOT.jar 同目录下,创建一个 jar的启动脚本deploy.sh,以后每次只要 :./deploy.sh start | status | stop | retart 来启动、停止项目。
动起来:
用的 ftpuser 用户,在该用户的目录下创建 deploy文件夹。 路径:/home/ftpuser/deploy
1、登录ftpuser ,创建deploy文件夹 mkdir deploy,将Jar上传至此文件夹。 再创建一个脚本文件: touch deploy.sh
touch deploy.sh
2、打开编辑这个脚本:vim deploy.sh
在脚本首行定义Shell 脚本
#!/bin/bash
3、再定义两个参数: JRE_NAME(项目路径) 和 LOG_PATH(日志路径)
#!/bin/bash
# 定义变量
# 要运行的jar包路径,加不加引号都行。 注意:等号两边 不能 有空格,否则会提示command找不到
JAR_NAME="/home/ftpuser/deploy/springbootTest-1.0-SNAPSHOT.jar"
# 日志路径,加不加引号都行。 注意:等号两边 不能 有空格,否则会提示command找不到
LOG_PATh=/home/ftpuser/deploy/stdout.log
4. 写一个 start() 方法:
# 启动方法
start() {
# 重新获取一下pid,因为其它操作如stop会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid为空时执行
if [ -z $pid ]; then
#nohup java -jar $JAR_NAME > /dev/null 2>&1 &
#nohup java Dloader.payh=./lib -jar $JAR_NAME > /dev/null 2>&1 &
nohup java -jar $JAR_NAME > $LOG_PATh 2>&1 &
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
echo ""
echo "Service ${JAR_NAME} is starting!pid=${pid}"
echo "........................Here is the log.............................."
echo "....................................................................."
tail -f $LOG_PATh
echo "........................Start successfully!........................."
else
echo ""
echo "Service ${JAR_NAME} is already running,it's pid = ${pid}. If necessary, please use command: sh auto_deploy.sh restart."
echo ""
fi
}
主要命令:pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
下面对这个命令拆分解析:
1)定义一个 pid
2)使用 ps -ef 去查看有没有这个 $JRE_NAME 应用的进程ID
ps -ef | grep $JRE_NAME :这个命令就是查看当前虚机有没有这个应用的进程。
3) 使用 | grep -v grep : 这个命令是反选,排除当前 ps -ef | grep 这个命令本身的进程。看个例子就知道了:
ps -ef | grep springbootTest-1.0-SNAPSHOT.jar 时:一般会有两条结果:
一条是 java -jar 的进程,还有一条就是 grep 自己的。
当使用 |grep -v grep 就是排除掉 grep 的这条。那么输出的就只有 java -jar 程序执行的这条
4) 最后部分就是 awk 命令了。 通常 awk 是用来做字符选择的,和 $ 符号配合使用。
用法:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
比如: 你有一个 1.txt 文档,里面有三行数据:
I am big man
Your name is fire
1 2 3 4
执行命令: awk '{print $2}' 1.txt,输出结果:
说白了就是选择当前文本中的($2)第二个字符,然后print输出 。
好了,知道这几个命令了,就该明白了:
ps -ef | grep $JAR_NAME | grep -v grep 将当前应用的执行进程情况打印的控制台:
ftpuser 537 523 2 16:21 pts/0 00:00:28 java -jar /home/biyi/zq_qywx_ht/zq-crm-1.0-SNAPSHOT.jar
它是有固定格式的:
第一个参数,ftpuser是当前进程的所属用户
第二个参数,就是当前应用的进程ID
至此,就不难理解了。ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2} 得到的就是当前应用 的进程ID,
其次就是: if [ -z $pid ]; then 这个命令,也不能理解:
这是逻辑判断的固定格式: if - then - else - fi 一个闭合的命令。
最后, -z :判断当前的字符长度为0返回ture
其他的命令 tail -f xx.log , echo 等命令简单,就不做解释了。
到这里,启动的具体方法start()就写好了,如果只是 ./deploy.sh 或 sh deploy.sh 来做启动那么,我们只需要,在后面再加一行 star(); 就可以了,实现,启动项目,并且日志滚动显示启动日志了。
而我们的目标是:通过参数来启动(start),停止(stop),查看状态。这里就需要写一个接收参数的方法:
# 根据输入参数执行对应方法,不输入则执行tips提示方法
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
tips
;;
esac
到这里就写完了:
直接 ./deploy.sh start 就可以直接启动项目了,并在控制台输出日志。
最后:还有 stop(), retart(), statu() 的方法,如果以上看懂了,相信也不难写了,留给你们自己实现了。