linux使用shell脚本启动springboot项目

脚本文件 startup.sh  

#!/usr/bin/env bash

INPUT=$2
FILE_PATH=`readlink -f ${INPUT}`
SERVICE=${INPUT##*/}
SERVICE_NAME=${SERVICE%.*}
DEPLOY_DIR=`pwd`
#JVM_OPTS="-server -Xms256m -Xmx512m -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m"
JVM_OPTS="-server -Xms256m -Xmx512m"

if [[ "$1" = "" ]];
then
    echo -e "\033[0;31m 未输入操作名 \033[0m  \033[0;34m {start|stop|restart|status} \033[0m"
    exit 1
fi

if [[ "$SERVICE" = "" ]];
then
    echo -e "\033[0;31m 未输入应用名 \033[0m"
    exit 1
fi

LOGS_DIR="$DEPLOY_DIR/logs/$SERVICE_NAME"
echo "$LOGS_DIR"
if [[ ! -d "$LOGS_DIR" ]]; then
        mkdir -p ${LOGS_DIR}
fi

LOG_PATH="$LOGS_DIR/stdout.out"
pid=0

start()
{
	checkPid
	if [[ ! -n "$pid" ]]; then
    BUILD_ID=dontKillMe  nohup java ${JVM_OPTS} -jar  ${FILE_PATH} >> ${LOG_PATH} 2>&1 &
    echo "$SERVICE_NAME is starting you can check the $LOG_PATH"
  else
      echo "$SERVICE_NAME is runing PID: $pid"
  fi
}

checkPid()
{
    pid=`ps -ef |grep ${FILE_PATH} |grep -v grep |awk '{print $2}'`
}

stop()
{
	checkPid
    if [[ ! -n "$pid" ]]; then
     echo "$SERVICE_NAME not runing"
    else
      echo "$SERVICE_NAME stop..."
      kill -9 ${pid}
    fi
}

restart()
{
	stop
	sleep 2
	start
}

status()
{
   checkPid
   if [[ ! -n "$pid" ]]; then
     echo "$SERVICE_NAME not runing"
   else
     echo "$SERVICE_NAME runing PID: $pid"
   fi
}

case $1 in
          start) start;;
          stop)  stop;;
          restart)  restart;;
          status)  status;;
              *)  echo "require start|stop|restart|status"  ;;
esac

启动命令:./startup.sh start|stop|restart|status filename.jar

命令解释及说明

#!/usr/bin/env bash

# 启动:./startup.sh restart  xxx/filename.jar

# 接收第二个参数,获取启动文件路径
INPUT=$2
# 获取文件的绝对路径
FILE_PATH=`readlink -f ${INPUT}`
# 获取文件名及后缀(filename.jar),去掉文件最后一个/及其左边的字符串
SERVICE=${INPUT##*/}
# 获取文件名(filename),去掉最后一个.极其右边的字符串
SERVICE_NAME=${SERVICE%.*}
DEPLOY_DIR=`pwd`
#JVM_OPTS="-server -Xms256m -Xmx512m -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m"
# 定义内存大小
JVM_OPTS="-server -Xms256m -Xmx512m"

# 判断启动类型是否为空
if [[ "$1" = "" ]];
then
	# echo -e 激活转义字符输出 
	# 格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 
	# 颜色码:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37
    echo -e "\033[0;31m 未输入操作名 \033[0m  \033[0;34m {start|stop|restart|status} \033[0m"
	# xit命令用于退出目前的shell,0执行成功,1执行失败
    exit 1
fi

if [[ "$SERVICE" = "" ]];
then
    echo -e "\033[0;31m 未输入应用名 \033[0m"
    exit 1
fi

# 日志文件目录
LOGS_DIR="$DEPLOY_DIR/logs/$SERVICE_NAME"
echo "$LOGS_DIR"

# 判断日志目录是否为目录,不为目录则创建文件
if [[ ! -d "$LOGS_DIR" ]]; then
        mkdir -p ${LOGS_DIR}
fi

LOG_PATH="$LOGS_DIR/stdout.out"
pid=0

# 启动函数
start()
{
	checkPid
	# 判断进程是否为空
	if [[ ! -n "$pid" ]]; then
    BUILD_ID=dontKillMe  nohup java ${JVM_OPTS} -jar  ${FILE_PATH} >> ${LOG_PATH} 2>&1 &
    echo "$SERVICE_NAME is starting you can check the $LOG_PATH"
  else
      echo "$SERVICE_NAME is runing PID: $pid"
  fi
}

checkPid()
{
	# #判断进程是否存在,如果不存在就启动它
    pid=`ps -ef |grep ${FILE_PATH} |grep -v grep |awk '{print $2}'`
}

# 停止函数
stop()
{
	checkPid
	# 判断进程是否为空
    if [[ ! -n "$pid" ]]; then
     echo "$SERVICE_NAME not runing"
    else
      echo "$SERVICE_NAME stop..."
	  # 杀死进程
      kill -9 ${pid}
    fi
}

# 重启函数
restart()
{
	stop
	sleep 2
	start
}

status()
{
   checkPid
   # 判断进程是否为空
   if [[ ! -n "$pid" ]]; then
     echo "$SERVICE_NAME not runing"
   else
     echo "$SERVICE_NAME runing PID: $pid"
   fi
}

# 判断启动命令第一个参数是启动/重启/停止
case $1 in
          start) start;;
          stop)  stop;;
          restart)  restart;;
          status)  status;;
              *)  echo "require start|stop|restart|status"  ;;
esac

语句说明

1、使用bash语法执行
	#!/bin/bash
	#!/bin/bash 是直接指定了应该去哪里找 bash, #!/usr/bin/env bash 则是告诉系统去 $PATH 包含的目录中找(优先使用)

2、启动脚本
	sh filename 表示执行sh脚本文件

	sh -x filename 表示查看这个脚本执行过程

3、定义变量
	定义变量的格式为: 变量名=变量的值
	
	d1=""
	
4、在脚本中使用变量 $变量名
	$d1
	
5、获取键盘输入的值 read
	read x
	表示接收键盘输入的值x
	
6、echo 输出字符串(双引号完全可以省略)
	echo "It is a test"
	
	输出变量,如:
	read name
	echo "$name It is a test"

	原样输出字符串,不进行转义或取变量(用单引号)
	echo '$name'
	
	显示命令执行结果(反引号 `, 而不是单引号 ')
	echo `date`
	
数学计算要用 [] 括起来且外头带一个 $

如:sum=$[5+4]

7、文件比较运算符
	
	-e filename  如果 filename存在,则为真  [ -e /var/log/syslog ]
	-d filename  如果 filename为目录,则为真  [ -d /tmp/mydir ]
	-f filename  如果 filename为常规文件,则为真  [ -f /usr/bin/grep ]
	-L filename  如果 filename为符号链接,则为真  [ -L /usr/bin/grep ]
	-r filename  如果 filename可读,则为真  [ -r /var/log/syslog ]
	-w filename  如果 filename可写,则为真  [ -w /var/mytmp.txt ]
	-x filename  如果 filename可执行,则为真  [ -L /usr/bin/grep ]
	
8、$( )与` `(反引号)都是用来作命令替换的,${ }变量替换
	$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围
	
9、查看进程
	ps -ef | grep data-sync-server-1.0.0.jar
	
10、启动jar
	nohup java ${JVM_OPTS} -jar  ${FILE_PATH} >> ${LOG_PATH} 2>&1 &

1、整数比较:

	-eq 等于,如:if [ "$a" -eq "$b" ] 或 if [ $a -eq $b ]
	-ne 不等于,如:if [ "$a" -ne "$b" ]
	-gt 大于,如:if [ "$a" -gt "$b" ]
	-ge 大于等于,如:if [ "$a" -ge "$b" ]
	-lt 小于,如:if [ "$a" -lt "$b" ]
	-le 小于等于,如:if [ "$a" -le "$b" ]
	== 等于,如:if if (("$a" == "$b"))
	< 小于(需要双括号),如:(("$a" < "$b"))
	<= 小于等于(需要双括号),如:(("$a" <= "$b"))
	> 大于(需要双括号),如:(("$a" > "$b"))
	>= 大于等于(需要双括号),如:(("$a" >= "$b"))
	特别说明的是(())字符和括号之间不需要留空格,但[[ ]],[]要求比较严格,需要留空格。

2、字符串比较,上面的-eq,-nq等公式只适用于数字比较,不适用于字符比较

	= 等于,如:if [ "$a" = "$b" ]
	== 等于,如:if [ "$a" == "$b" ],与=等价
	[[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true
	[[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
	[ $a == z* ] # File globbing 和word splitting将会发生
	[ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true

3、括号之间的区别:

	[[ ]],[]对括号内变量要求严格且且敏感,但(())则相对宽松一些
	[plain] view plain copy
	1、if [[ $a == $b ]] 和 if [[ $a == $b ]] 等价
	但if [[ $a == $b ]] 和if [[ a == b ]] 不等价
	2、if (($a == $b)) 和 if (($a = $b))等价
	if (($a == $b)) 和 if ((a == b)) 等价
	
4、多条件判断:

	&&和||适用于[[ ]]和(),-a和-o适用于[]中
	-a         与 
	-o        或 
	!        非

	举例如下:
	[plain] view plain copy
	if ((i == 1)) 和 if [ "$i" == 1 ]等价
	if [[ "$i" = 1 && "$j" = 2 ]] 和 if ((i = 1)) || ((j = 2))
	
5、其它说明:

	!= 不等于,如:if [ "$a" != "$b" ]
	这个操作符将在[[]]结构中使用模式匹配.
	< 小于,在ASCII字母顺序下.如:
	if [[ "$a" < "$b" ]]
	if [ "$a" \< "$b" ]
	注意:在[]结构中"<"需要被转义.
	> 大于,在ASCII字母顺序下.如:
	if [[ "$a" > "$b" ]]
	if [ "$a" \> "$b" ]
	
	

https://blog.csdn.net/qq13650793239/article/details/105745576

shell中各种括号的作用详解()、(())、[]、[[]]、{}
https://www.jb51.net/article/123081.htm

Linux—shell中$(( ))、$( )、``与${ }的区别
https://www.cnblogs.com/chengd/p/7803664.html

	先赋值一个变量为一个路径,如下:
	file=/dir1/dir2/dir3/my.file.txt

	命令    解释    结果
	${file#*/}    拿掉第一条 / 及其左边的字符串    dir1/dir2/dir3/my.file.txt
	[root@localhost ~]# echo ${file#*/}
	dir1/dir2/dir3/my.file.txt

	${file##*/}    拿掉最后一条 / 及其左边的字符串    my.file.txt
	[root@localhost ~]# echo ${file##*/}
	my.file.txt

	${file#*.}    拿掉第一个 . 及其左边的字符串    file.txt
	[root@localhost ~]# echo ${file#*.}
	file.txt

	${file##*.}    拿掉最后一个 . 及其左边的字符串    txt
	[root@localhost ~]# echo ${file##*.}
	txt

	${file%/*}    拿掉最后一条 / 及其右边的字符串    /dir1/dir2/dir3
	[root@localhost ~]# echo ${file%/*}
	/dir1/dir2/dir3

	${file%%/*}    拿掉第一条 / 及其右边的字符串    (空值)
	[root@localhost ~]# echo ${file%%/*}
	(空值)

	${file%.*}    拿掉最后一个 . 及其右边的字符串    /dir1/dir2/dir3/my.file
	[root@localhost ~]# echo ${file%.*}
	/dir1/dir2/dir3/my.file

	${file%%.*}    拿掉第一个 . 及其右边的字符串    /dir1/dir2/dir3/my
	[root@localhost ~]# echo ${file%%.*}
	/dir1/dir2/dir3/my
	记忆方法如下:

	# 是去掉左边(在键盘上 # 在 $ 之左边)
	% 是去掉右边(在键盘上 % 在 $ 之右边)
	单一符号是最小匹配;两个符号是最大匹配
	*是用来匹配不要的字符,也就是想要去掉的那部分
	还有指定字符分隔号,与*配合,决定取哪部分

 

相关资料:

Linux脚本中$#、$0、$1、$@、$*、$$、$? - 曲项向天歌 - 博客园

Linux—shell中$(( ))、$( )、``与${ }的区别 - chengd - 博客园

https://www.jb51.net/article/123081.htm

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值