shell脚本提供了一键启动、停止、重启及每个服务单独的重启的函数。

脚本实现了:

  • 调用sh文件根据不同的入参调用不同的函数
  • 创建文件夹
  • 创建文件
  • 自定义函数调用自定义函数(调用函数时传入参数)
  • 调用jar包运行(设置占用内存)

 

目录

一、创建shell文件

二、编写代码

三、linux终端运行脚本

1、查看服务运行状态

2、一键启动

3、一键停止

4、一键重启

5、单个服务重启(以message服务为例)


  微服务架构下,服务比较多。每次安装部署的时候,一个个启动很麻烦。编写脚本实现服务的一键启动、停止、重启及每个服务单独的重启,以简化安装部署工作。

步骤:

一、创建shell文件

创建一个文本文件,重命名为:philicube_start.sh

二、编写代码

总体代码如下:

#!/bin/bash
#author:zilong 
#file: philicube_start.sh
#comment: PhiliCube start script.
#histroy:
#	2021-03-30 10:00AM created by Zi Long at Philisense
#	add openrestyStart.sh

##初始化参数

#服务名
SERVICE_NAME=(
	phili-gateway
	phili-auth-server
	phili-exchange
	phili-es-log
	phili-message
  openresty
)

#服务启动包所在的目录,根据实际地址设置
SERVICE_PATH=(
	/PhiliCube/Application/PhiliGateway
	/PhiliCube/Application/PhiliAuthority
	/PhiliCube/Application/PhiliExchange
	/PhiliCube/Application/PhiliEsLog
	/PhiliCube/Application/PhiliMessage
  /PhiliCube/Application/PhiliWsGateway
)

#服务启动包
SERVICE_PACKAGE=(
	phili-gateway.jar
	phili-auth-server.jar
	phili-exchange.jar
	phili-es-log.jar
	phili-message.jar
	openrestyStart.sh
)

#	脚本提示信息
tips(){
  echo "-------------------------------------"
  echo ""
	echo "Version:1.0"
	echo "Author:zilong"
	echo "Comment:"
	echo "  命令举例:sh philicube_start.sh - status"
	echo "  当前支持如下服务的启动:gateway、auth、exchange、eslog、message"
  echo "  启动参数:"
  echo "	  -status   -查看平台所有服务运行状态"
  echo "	  -start    -启动平台所有服务"
  echo "	  -stop     -停止平台所有服务"
  echo "	  -restart  -重启平台所有服务"
	echo "	  -gateway  -重启网关服务"
	echo "	  -auth     -重启权限服务"
	echo "	  -exchange -重启实时服务"
	echo "	  -eslog    -重启日志服务"
	echo "	  -message  -重启消息服务"
	echo "	  -ws  -重启PhiliWsGateway服务"
  echo ""
  echo "-------------------------------------"
}

#查看状态
status(){
echo ""
echo "---------查看状态 开始执行 ...-----------"
	for((i=0;i<${#SERVICE_NAME[@]};i++))
  do
    num=$((i+1))
    service_name=${SERVICE_NAME[i]}
    #查找pid之ps方法
    service_pid=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
    if [ -z "$service_pid" ]; then
      echo "---	服务$num: 【$service_name】未运行!!!"
    else
      echo "---	服务$num: 【$service_name】【$service_pid】运行中..."
    fi
  done
echo "---------查看状态 执行完毕 !!!-----------"
echo ""
}

#一键启动
start(){
  echo ""
  echo "---------启动程序 开始执行 ...-----------"
	for((i=0;i<${#SERVICE_NAME[@]};i++))
	do
		num=$((i+1))
		service_name=${SERVICE_NAME[i]}
		service_path=${SERVICE_PATH[i]}
		service_package=${SERVICE_PACKAGE[i]}
		echo "---服务$num:【$service_name】开始启动 ..."
		echo "--- 服务目录地址为: $service_path"
		echo "--- 服务安装程序为: $service_package"

		cd "$service_path" || return
		#	path=`pwd`
    # echo "---	当前目录地址为:$path"
		##创建日志目录及文件
		echo "--- 初始化日志目录及文件..."
		TODAY=$(date +%Y-%m-%d)
		LOG_NAME="log-$TODAY.txt"
		FULL_LOG_NAME=logs/$LOG_NAME
		##创建文件夹
		if [ ! -d logs ];then
			mkdir logs
		fi
		##创建文件
		if [ ! -e "$FULL_LOG_NAME" ];then
			touch "$FULL_LOG_NAME"
		fi

		service_pid=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
    if [ -n "$service_pid" ];then
      echo "--- $service_name进程存在,无需启动。当前进程为:$service_pid"
    else
      #启动服务
      echo "--- $service_name进程不存在,启动服务 ..."

      #获取文件名后缀,判定文件类型
      service_package=${SERVICE_PACKAGE[i]}
      extension=$(dealFileName "$service_package")
      if [ $extension = "jar" ];then
        #运行java服务并在后台执行
        nohup java -jar -Xmx512m -Xms512m "$service_package" --info >"$FULL_LOG_NAME" &
      elif [ "$extension" = "sh" ]; then
        #打开终端,执行命令
        gnome-terminal -x bash -c "./$service_package;"
        #睡1秒,等程序反应,否则可能拿不到pid
        sleep 1
      elif [ "$extension" = "out" ]; then
        #exec bash;是让打开的终端在执行完脚本后不关闭
        gnome-terminal -x bash -c "./$service_package;exec bash;"
        #睡1秒,等程序反应,否则可能拿不到pid
        sleep 1
      else
        echo "  未识别的文件类型,文件类型为:【$extension】"
      fi

      #判断服务启动成功
      service_pid_new=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
      until [ -n "$service_pid_new" ]
        do
          service_pid_new=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
        done
      echo "--- $service_name 启动完毕!!!当前进程为:$service_pid_new"
    fi
		sleep 1
	done
  echo "---------启动程序 执行完毕 !!!-----------"
  echo ""
}

#一键停止
stop(){
  echo ""
  echo "---------停止程序 开始执行 ...-----------"
	for((i=0;i<${#SERVICE_NAME[@]};i++))
	do
		num=$((i+1))
		service_name=${SERVICE_NAME[i]}
		service_pid=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
		if [ "$service_pid" == "" ]; then
			echo "---	服务$num: 【$service_name】进程不存在或已停止运行!!!"
		else
			kill -9 "$service_pid"
			echo "---	服务$num: 【$service_name】停止成功。"
		fi
		sleep 1
	done
  echo "---------停止程序 执行完毕 !!!-----------"
  echo ""
}

#一键重启
restart(){
  echo ""
  echo "---------重启 开始执行 ...-----------"
	stop
	sleep 1
	start
	sleep 1
	status
  echo "---------重启 执行完毕 !!!-----------"
  echo ""
}

#重启某服务处理函数
reservice(){
	echo "---	获取参数 ..."
	service_name=$1
	service_path=$2
	service_package=$3
	echo "---	服务名称为:	【$service_name】"
	echo "---	服务目录地址为:$service_path"
	echo "---	服务安装程序为:$service_package"
  #到启动程序目录
	cd "$service_path" || return
	#	path=`pwd`
  # echo "---	当前目录地址为:$path"

	#创建日志目录及文件
	echo "---	初始化日志目录及文件..."
	TODAY=$(date +%Y-%m-%d)
	LOG_NAME="log-$TODAY.txt"
	FULL_LOG_NAME=logs/$LOG_NAME
	#创建文件夹
	if [ ! -d logs ];then
		mkdir logs
	fi
	#创建文件
	if [ ! -e "$FULL_LOG_NAME" ];then
		touch "$FULL_LOG_NAME"
	fi
	#检查服务是否存在进程,有则杀掉
	pid=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
	if [  -n "$pid"  ]; then
	  echo "---	服务进程存在,pid=[$pid]关闭当前进程 ..."
		kill -9 "$pid"
		echo "---	清理进程后,启动 ..."
	else
		echo "---	服务进程不存在 ..."
	fi

	#获取文件名后缀,判定文件类型
  extension=$(dealFileName "$service_package")
  if [ $extension = "jar" ];then
    #运行java服务并在后台执行
    nohup java -jar -Xmx512m -Xms512m "$service_package" --info >"$FULL_LOG_NAME" &
  elif [ "$extension" = "sh" ]; then
    #打开终端,执行命令
    gnome-terminal -x bash -c "./$service_package;"
    #睡1秒,等程序反应,否则可能拿不到pid
    sleep 1
  elif [ "$extension" = "out" ]; then
     #exec bash;是让打开的终端在执行完脚本后不关闭
    gnome-terminal -x bash -c "./$service_package;exec bash;"
    #睡1秒,等程序反应,否则可能拿不到pid
    sleep 1
  else
    echo "  未识别的文件类型,文件类型为:【$extension】"
  fi

  #service_pid_new=$(ps -ef | grep "$service_name" | grep -v "grep" | awk '{print $2}')
  service_pid_new=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
  until [ -n "$service_pid_new" ]
    do
      service_pid_new=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')
    done
  echo "---	服务已启动,当前进程为:$service_pid_new"
}
#解析传入的文件名,获取后缀
#支持带路径,格式如:/the/path/foo.txt
# 返回值对应文件类型 1 jar 2 sh 3 out
dealFileName(){
	fullfile=$1
	dir=$(dirname "$fullfile")
  fullname=$(basename "$fullfile")
  filename=$(echo "$fullname" | cut -d . -f1)
  extension=$(echo "$fullname" | cut -d . -f2)
#  echo "  dir       =   $dir"
#  echo "  fullname  =   $fullname"
#  echo "  filename  =   $filename"
#  echo "  extension =   $extension"
  if [ "$extension" = "jar" ];then
    echo "jar"
  elif [ "$extension" = "sh" ]; then
    echo "sh"
  elif [ "$extension" = "out" ]; then
    echo "out"
  else
    echo "other"
  fi
}
#网关服务
gateway(){
  echo ""
  echo "---------网关服务 程序开始执行 ... -----------"
	service_name=${SERVICE_NAME[0]}
	service_path=${SERVICE_PATH[0]}
	service_package=${SERVICE_PACKAGE[0]}
	reservice "$service_name" "$service_path" "$service_package"
  echo "---------网关服务 程序执行完毕 !!!-----------"
  echo ""
}

#权限服务
auth(){
  echo ""
  echo "---------权限服务 程序开始执行 ... -----------"
	service_name=${SERVICE_NAME[1]}
	service_path=${SERVICE_PATH[1]}
	service_package=${SERVICE_PACKAGE[1]}
	reservice "$service_name" "$service_path" "$service_package"
  echo "---------权限服务 程序执行完毕 !!!-----------"
  echo ""
}

#实时服务
exchange(){
  echo ""
  echo "---------实时服务 程序开始执行 ... -----------"
	service_name=${SERVICE_NAME[2]}
	service_path=${SERVICE_PATH[2]}
	service_package=${SERVICE_PACKAGE[2]}
	reservice "$service_name" "$service_path" "$service_package"
  echo "---------实时服务 程序执行完毕 !!! -----------"
  echo ""
}

#日志服务
eslog(){
  echo ""
  echo "---------日志服务 程序开始执行 ... -----------"
	service_name=${SERVICE_NAME[3]}
	service_path=${SERVICE_PATH[3]}
	service_package=${SERVICE_PACKAGE[3]}
	reservice "$service_name" "$service_path" "$service_package"
  echo "---------日志服务 程序执行完毕 !!!-----------"
  echo ""
}

#消息服务
message(){
  echo ""
  echo "---------消息服务 程序开始执行 ... -----------"
	service_name=${SERVICE_NAME[4]}
	service_path=${SERVICE_PATH[4]}
	service_package=${SERVICE_PACKAGE[4]}
	reservice "$service_name" "$service_path" "$service_package"
  echo "---------消息服务 程序执行完毕 !!!-----------"
  echo ""
}

#消息服务
ws(){
  echo ""
  echo "---------消息服务 程序开始执行 ... -----------"
	service_name=${SERVICE_NAME[5]}
	service_path=${SERVICE_PATH[5]}
	service_package=${SERVICE_PACKAGE[5]}
	reservice "$service_name" "$service_path" "$service_package"
  echo "---------消息服务 程序执行完毕 !!!-----------"
  echo ""
}

#终端输入参数调用
case "$1" in
	"-status")
     status
     ;;
    "-start")
     start
     ;;
    "-stop")
     stop
     ;;
    "-restart")
     restart
     ;;
	"-gateway")
     gateway
     ;;
	 "-auth")
     auth
     ;;
	"-exchange")
     exchange
     ;;
	 "-eslog")
     eslog
     ;;
	 "-message")
     message
     ;;
   "-ws")
     ws
     ;;
    *)
     tips
     ;;
esac    
exit 0

三、linux终端运行脚本

输入命令

sh philicube_start.sh

提示脚本功能,如下图所示:

java服务不断重启是什么原因 重启java服务shell_shell

1、查看服务运行状态

输入命令

sh philicube_start.sh -status

终端显示每个服务的运行状态。如下图所示:

java服务不断重启是什么原因 重启java服务shell_java服务不断重启是什么原因_02

2、一键启动

输入命令

sh philicube_start.sh -start

依次启动各个服务。如下图所示:

java服务不断重启是什么原因 重启java服务shell_java服务不断重启是什么原因_03

3、一键停止

输入命令

sh philicube_start.sh -stop

依次停止各个服务。如下图所示:

java服务不断重启是什么原因 重启java服务shell_java服务不断重启是什么原因_04

4、一键重启

输入命令

sh philicube_start.sh -restart

先逐个关闭,再一次启动。如下图所示:

java服务不断重启是什么原因 重启java服务shell_java_05

5、单个服务重启(以message服务为例)

输入命令

sh philicube_start.sh -message

先关闭服务,再启动。如下图所示:

java服务不断重启是什么原因 重启java服务shell_重启_06