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:#-03-30 10:00AM created by Zi Long at Philisense#add openrestyStart.sh##初始化参数#服务名SERVICE_NAME=(phili-gatewayphili-auth-serverphili-exchangephili-es-logphili-messageopenresty)#服务启动包所在的目录,根据实际地址设置SERVICE_PATH=(/PhiliCube/Application/PhiliGateway/PhiliCube/Application/PhiliAuthority/PhiliCube/Application/PhiliExchange/PhiliCube/Application/PhiliEsLog/PhiliCube/Application/PhiliMessage/PhiliCube/Application/PhiliWsGateway)#服务启动包SERVICE_PACKAGE=(phili-gateway.jarphili-auth-server.jarphili-exchange.jarphili-es-log.jarphili-message.jaropenrestyStart.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++))donum=$((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" ]; thenecho "---服务$num: 【$service_name】未运行!!!"elseecho "---服务$num: 【$service_name】【$service_pid】运行中..."fidoneecho "---------查看状态 执行完毕 !!!-----------"echo ""}#一键启动start(){echo ""echo "---------启动程序 开始执行 ...-----------"for((i=0;i<${#SERVICE_NAME[@]};i++))donum=$((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 ];thenmkdir logsfi##创建文件if [ ! -e "$FULL_LOG_NAME" ];thentouch "$FULL_LOG_NAME"fiservice_pid=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')if [ -n "$service_pid" ];thenecho "--- $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秒,等程序反应,否则可能拿不到pidsleep 1elif [ "$extension" = "out" ]; then#exec bash;是让打开的终端在执行完脚本后不关闭gnome-terminal -x bash -c "./$service_package;exec bash;"#睡1秒,等程序反应,否则可能拿不到pidsleep 1elseecho " 未识别的文件类型,文件类型为:【$extension】"fi#判断服务启动成功service_pid_new=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')until [ -n "$service_pid_new" ]doservice_pid_new=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')doneecho "--- $service_name 启动完毕!!!当前进程为:$service_pid_new"fisleep 1doneecho "---------启动程序 执行完毕 !!!-----------"echo ""}#一键停止stop(){echo ""echo "---------停止程序 开始执行 ...-----------"for((i=0;i<${#SERVICE_NAME[@]};i++))donum=$((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" == "" ]; thenecho "---服务$num: 【$service_name】进程不存在或已停止运行!!!"elsekill -9 "$service_pid"echo "---服务$num: 【$service_name】停止成功。"fisleep 1doneecho "---------停止程序 执行完毕 !!!-----------"echo ""}#一键重启restart(){echo ""echo "---------重启 开始执行 ...-----------"stopsleep 1startsleep 1statusecho "---------重启 执行完毕 !!!-----------"echo ""}#重启某服务处理函数reservice(){echo "---获取参数 ..."service_name=$1service_path=$2service_package=$3echo "---服务名称为:【$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 ];thenmkdir logsfi#创建文件if [ ! -e "$FULL_LOG_NAME" ];thentouch "$FULL_LOG_NAME"fi#检查服务是否存在进程,有则杀掉pid=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')if [ -n "$pid" ]; thenecho "---服务进程存在,pid=[$pid]关闭当前进程 ..."kill -9 "$pid"echo "---清理进程后,启动 ..."elseecho "---服务进程不存在 ..."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秒,等程序反应,否则可能拿不到pidsleep 1elif [ "$extension" = "out" ]; then#exec bash;是让打开的终端在执行完脚本后不关闭gnome-terminal -x bash -c "./$service_package;exec bash;"#睡1秒,等程序反应,否则可能拿不到pidsleep 1elseecho " 未识别的文件类型,文件类型为:【$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" ]doservice_pid_new=$(ps -ef | grep "$service_name" | grep -v grep | grep -v bash | awk '{print $2}')doneecho "---服务已启动,当前进程为:$service_pid_new"}#解析传入的文件名,获取后缀#支持带路径,格式如:/the/path/foo.txt# 返回值对应文件类型 1 jar 2 sh 3 outdealFileName(){fullfile=$1dir=$(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" ];thenecho "jar"elif [ "$extension" = "sh" ]; thenecho "sh"elif [ "$extension" = "out" ]; thenecho "out"elseecho "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
先关闭服务,再启动。如下图所示:
如果觉得《Linux之shell脚本实现java服务的一键启动 停止 重启及每个服务单独的重启》对你有帮助,请点赞、收藏,并留下你的观点哦!