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
提示脚本功能,如下图所示:
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
先关闭服务,再启动。如下图所示: