用最简单的shell脚本启动Springboot项目

用最简单的shell脚本启动Springboot项目

文章目录

  • 用最简单的shell脚本启动Springboot项目
    • 代码实例
    • 主要方法
      • 1.获取当前脚本文件路径
      • 2.获取文件列表
      • 3.判断是否运行
      • 4.创建日志文件
      • 5.遍历文件列表运行jar文件
    • 总结

代码实例

#!/bin/bash

# start java application springsell

#获取文件路径
bin_path=`cd $(dirname $0); pwd`
#读取文件下所有文件
files=$(ls $bin_path)
logfile=$bin_path/log/eureka.log

checkps(){
  PID=$(ps -ef | grep $1 | grep -v grep | awk '{print $2}')

  if [ -z "$PID" ];then
    echo Application is already stopped
  else
    echo '$1 is running,are you sure to close the file?(y or n)'
    read choice
    #判断是否关闭
    if [ "$choice" = "y" ];then
      echo kill $PID
      kill $PID
    fi
    exit
  fi
}

creatlogfile(){
  if [ ! -d "$bin_path/log" ];then
    mkdir $bin_path/log
  fi
  if [ ! -f "$logfile" ];then
    touch $logfile
  fi
}

runjar(){
  #检查是否已经运行
  echo $1
  checkps $1

  creatlogfile
  $(nohup java -jar $1 > $logfile 2>&1 & )
}

for filename in $files
do
  if [ "${filename##*.}"x = "jar"x ];then
    runjar $filename
    echo "$filename is running..."
    echo successful
  fi
done

主要方法

1.获取当前脚本文件路径

bin_path=`cd $(dirname $0); pwd`

这里的反引号不容易辨别,也可以用$()代替

$0代表文件名,作用是获取当前脚本所在文件的文件名

dirname是linux中查看文件路径的函数

然后pwd就可以直接输出文件路径

这里我觉的直接写成bin_path=$(cd $(.); pwd)也可以,我没有试过,有兴趣可以自己试一下

# root@cuizja in /usr/filelist $ dirname start.sh 
.
# root@cuizja in /usr/filelist $ dirname /usr/filelist       
/usr

2.获取文件列表

files=$(ls $bin_path)

$bin_path是调用刚刚获取到的脚本文件路径,这里的作用相当于在命令行直接输入ls 文件目录

# root@cuizja in /usr/filelist $ ls /usr/filelist 
eureka-0.0.1-SNAPSHOT.jar  log  start.sh

3.判断是否运行

checkps(){
  PID=$(ps -ef | grep $1 | grep -v grep | awk '{print $2}')

  if [ -z "$PID" ];then
    echo Application is already stopped
  else
    echo '$1 is running,are you sure to close the file?(y or n)'
    read choice
    #判断是否关闭
    if [ "$choice" = "y" ];then
      echo kill $PID
      kill $PID
    fi
    exit
  fi
}

ps -ef 获取linux中的后台任务

grep $1 返回包含关键字的结果,$1表示方法传入的第一个参数

grep -v grep 这里-v代表反向查询,返回不包含grep的结果,因为ps命令的结果中,当前grep命令也会返回,需要剔除出去

awk '{print $2}' awk是一个报告生成器,作用是打印返回结果的第二列,也就是获取PID

if [ -z "$PID" ] 判断获取到的PID是否为空

read choice 在控制台输入y or n决定是否关闭已经运行的进程

kill $PID 杀死运行的进程

关于awk有兴趣的可以点击这里了解一下

4.创建日志文件

creatlogfile(){
  if [ ! -d "$bin_path/log" ];then
    mkdir $bin_path/log
  fi
  if [ ! -f "$logfile" ];then
    touch $logfile
  fi
}

mkdir $bin_path/log 判断是否已经存在文件目录,不存在,创建文件目录

touch $logfile 如果不存在日志文件,创建日志文件

5.遍历文件列表运行jar文件

runjar(){
  #检查是否已经运行
  echo $1
  checkps $1
  creatlogfile
  $(nohup java -jar $1 > $logfile 2>&1 & )
}

for filename in $files
do
  if [ "${filename##*.}"x = "jar"x ];then
    runjar $filename
    echo "$filename is running..."
    echo successful
  fi
done

checkps $1 调用检查后台任务的方法

creatlogfile 调用创建文件目录的方法

$(nohup java -jar $1 > $logfile 2>&1 & )

nohup 后台运行命令

java -jar $1 运行jar文件,$1是传入的文件名

> $logfile 2>&1 & 将运行日志输出到日志文件

if [ "${filename##*.}"x = "jar"x ]判断只有jar文件才运行,

这里的##*.表示到.之前的字符串全部删除,后去文件的后缀名

总结

shell脚本的核心是对linux命令的拼接,关键是对基础命令的掌握,通过这个脚本从无到有的过程,了解了更多没有接触过的用法

懒人多作怪,感谢阅读,欢迎交流~~

你可能感兴趣的:(学习)