从0开始撸一个JAR的启动脚本

目标:想在 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() 的方法,如果以上看懂了,相信也不难写了,留给你们自己实现了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值