shell脚本提供了一键启动、停止、重启及每个服务单独的重启的函数。
脚本实现了:
- 调用sh文件根据不同的入参调用不同的函数
- 创建文件夹
- 创建文件
- 自定义函数调用自定义函数(调用函数时传入参数)
- 调用jar包运行(设置占用内存)
目录
微服务架构下,服务比较多。每次安装部署的时候,一个个启动很麻烦。编写脚本实现服务的一键启动、停止、重启及每个服务单独的重启,以简化安装部署工作。
步骤:
一、创建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
提示脚本功能,如下图所示:
1、查看服务运行状态
输入命令
sh philicube_start.sh -status
终端显示每个服务的运行状态。如下图所示:
2、一键启动
输入命令
sh philicube_start.sh -start
依次启动各个服务。如下图所示:
3、一键停止
输入命令
sh philicube_start.sh -stop
依次停止各个服务。如下图所示:
4、一键重启
输入命令
sh philicube_start.sh -restart
先逐个关闭,再一次启动。如下图所示:
5、单个服务重启(以message服务为例)
输入命令
sh philicube_start.sh -message
先关闭服务,再启动。如下图所示:
THE END