# 实战脚本示例
jar包运维脚本
#!/bin/bash
# jar包服务运维脚本
################################################
# jar包服务运维脚本
################################################
# 使用方式:
# 需要使用jysp用户
# 服务运维:./xxx.sh 根据菜单操作
# 查看进程ID:./xxx.sh pid
#################################################
# 不允许使用root用户执行
user=$(env | grep USER | cut -d "=" -f 2)
if [ "$user" == "root" ]
then
echo "user is root"
exit
fi
sleep 1
# cpu架构
iso=$(arch)
if [ "$iso" == "aarch64" ];then
javarun="java_runsv_arm"
elif [ "$iso" == "x86_64" ];then
javarun="java_runsv_x86"
fi
#脚本所在目录
current_path=$(cd $(dirname $0);pwd)
################################################
# 维护jar包数据源
################################################
# jar包服务
# javasv_attr字段说明:
# 参数一:1,2 一级目录
# 参数二:jar包存放目录
# 参数三:最小内存
# 参数四:最大内存
# 参数五:读取yml路径
#################################################
javasv=(
jysp-da-business-authority-server-0.0.1-SNAPSHOT.jar
jysp-da-plugin-fileserver-server-0.0.1-SNAPSHOT.jar
jysp-da-plugin-gateway-0.0.1-SNAPSHOT.jar
jysp-da-dataflow-patrol-robot-master-0.0.1-SNAPSHOT.jar
jysp-da-business-system-server-0.0.1-SNAPSHOT.jar
jysp_cruise-0.0.1-SNAPSHOT.jar
jysp_cruise_algorithm-0.0.1-SNAPSHOT.jar
jysp_device-0.0.1-SNAPSHOT.jar
jysp_home_page-0.0.1-SNAPSHOT.jar
jysp_ir_xj-0.0.1-SNAPSHOT.jar
jysp_robot-0.0.1-SNAPSHOT.jar
jysp_sequential_control-0.0.1-SNAPSHOT.jar
jysp_system-0.0.1-SNAPSHOT.jar
jysp_video-0.0.1-SNAPSHOT.jar
jysp_voice_new-0.0.1-SNAPSHOT.jar
jysp_warn-0.0.1-SNAPSHOT.jar
jysp_web_new-0.0.1-SNAPSHOT.jar
jysp_exchange-0.0.1-SNAPSHOT.jar
jysp_hik_ir-0.0.1-SNAPSHOT.jar
)
declare -A javasv_attr
javasv_attr["${javasv[ 0]}"]="1,authority,256m,256m"
javasv_attr["${javasv[ 1]}"]="1,fileSever,2048m,2048m"
javasv_attr["${javasv[ 2]}"]="1,gateway,1024m,1024m"
javasv_attr["${javasv[ 3]}"]="1,robot,1024m,1024m"
javasv_attr["${javasv[ 4]}"]="1,system,1024m,1024m"
javasv_attr["${javasv[ 5]}"]="2,cruise,2048m,2048m"
javasv_attr["${javasv[ 6]}"]="2,cruise_algorithm,2048m,2048m"
javasv_attr["${javasv[ 7]}"]="2,device,4096m,4096m"
javasv_attr["${javasv[ 8]}"]="2,home,512m,512m"
javasv_attr["${javasv[ 9]}"]="2,ir,1024m,1024m"
javasv_attr["${javasv[10]}"]="2,robot,1024m,1024m"
javasv_attr["${javasv[11]}"]="2,sequential,1024m,1024m"
javasv_attr["${javasv[12]}"]="2,system,512m,512m"
javasv_attr["${javasv[13]}"]="2,video,1024m,1024m"
javasv_attr["${javasv[14]}"]="2,voice,1024m,1024m"
javasv_attr["${javasv[15]}"]="2,warn,1024m,1024m"
javasv_attr["${javasv[16]}"]="2,web,1024m,1024m"
javasv_attr["${javasv[17]}"]="2,exchange,1024m,1024m,1"
javasv_attr["${javasv[18]}"]="2,hik,1024m,1024m"
services_arr=(
avscms
avsdms
protocoltrans
MG-storage
avsirsvr
)
################################################
# 检查进程PID
################################################
# ./xxx.sh pid
#################################################
function service_pid(){
# 合并两个数组到一起
service_pid_arr=("${services_arr[@]}" "${javasv[@]}")
# 数组去重
# service_pid_arr=($(printf "%s\n" "${service_pid_arr[@]}" | sort | uniq))
# 循环获取ID
for((i=0;i<${#service_pid_arr[*]};i++))
do
ser_pid=$(ps -ef | grep "${service_pid_arr[i]}" | grep -v grep | grep -v runsv | awk '{print $3,$2}')
echo "runsv 和 ${service_pid_arr[i]}的PID分别是:$ser_pid"
done
# nacos_pid=`ps -ef | grep nacos | grep -v grep | awk '{print$2}'`
# tomcat_pid=`ps -ef | grep tomcat | grep -v grep | grep -v nacos | awk '{print$2}'`
# emqxl_pid=`ps -ef | grep emqx | grep daemon | awk '{print $2}'`
}
################################################
# setTable:
################################################
# \e[:颜色开始
# \e[0m:颜色结束
# 31m:红色
#################################################
function setTable(){
# 使用 column 按照“#”进行对齐 column -s "#" -t
# 利用awk命令替换掉以 +开头的行,并替换空格为 -
echo -e "\e[31m"$1"\e[0m"|column -s "#" -t|awk '{if($0 ~ /^+/){gsub(" ","-",$0);print $0}else{print $0}}'
}
function setTableRow(){
# 所有参数
local value=$*
# 获取参数个个数
local varCount=$#
# 计算表格边缘长度
local num=$(( $varCount * 2 + 1 ))
split=$(seq -s '+#' $num | sed 's/[0-9]//g')+
if [ -z $table ]
then
# 上边框
table="\n${split}\n"
# 内容框
local tableRow
for k in "$@"
do
tableRow=$tableRow"#$k#|"
done
table="${table}|$tableRow\n"
# 下边框
table="${table}${split}\n"
# 上一个边框记录
lastTabCount=$varCount
else
# 判断是否需要增加边框
if [ $varCount -gt $lastTabCount ]
then
# 增加边框
local difCount=$(( $varCount - $lastTabCount ))
local difNum=$(( $difCount * 2 + 1 ))
difSplit=$(seq -s '+#' $difNum | sed 's/[0-9]//g')+
# 删除原有后缀,增加长度
table="${table%+\\n}"
table="${table}${difSplit}\n"
fi
# 内容框
local tableRow
for k in "$@"
do
tableRow=$tableRow"#$k#|"
done
table="${table}|$tableRow\n"
# 下边框
table="${table}${split}\n"
fi
}
################################################
# 选择服务是动作
################################################
# 参数一:操作动作 1 启动,2 停止,3 重启
# 参数二:服务ID
#################################################
function option_sure(){
case $1 in
1)
java_start $2
;;
2)
java_stop $2
;;
3)
java_stop $2
sleep 1
java_start $2
esac
}
################################################
# 选择服务是动作:启动jar包
################################################
# 参数一:serv_id
#################################################
#$1:flag(1/2) $2:dirname $3:Xms $4:Xmx $5:jar_name
function java_start(){
# 从服务列表中取出服务名
local start_jar_name=${javasv[$(($1-1))]}
local start_jar_attr=${javasv_attr[$start_jar_name]}
# 查看 狗和jar程序运行情况
pid_runsv=$(ps -ef | grep "$start_jar_name" | grep -v grep | grep "java_runsv_" | awk '{print $2}')
pid_java=$(ps -ef | grep "$start_jar_name" | grep -v grep | grep -v "java_runsv_" | awk '{print $2}')
# 检查服务
if [ "x$pid_runsv" != "x" ]
then
if [ "X$pid_java" != "X" ]
then
echo "$start_jar_name 正在运行"
return
else
echo "$start_jar_name 的java_runsv正在运行,$start_jar_name 未运行,请检查"
return
fi
else
if [ "X$pid_java" != "X" ]
then
echo "$start_jar_name 正在运行,java_runsv未运行,请检查"
return
fi
fi
# 检查服务配置
# 通过服务ID-->找到服务名-->找服务配置-->解析
if [ -z "$start_jar_attr" ]; then
echo -e "\e[31m"$start_jar_name'未配置【启动参数】'"\e[0m"
return
fi
# 解析配置参数
IFS=',' read -ra jar_attr_arr <<< "$start_jar_attr"
if [ ${#jar_attr_arr[@]} != 4 -a ${#jar_attr_arr[@]} != 5 ]; then
echo -e "\e[31m"$start_jar_name'配置参数个数有误'"\e[0m"
return
fi
# echo ${jar_attr_arr[0]},${jar_attr_arr[0]},${jar_attr_arr[0]},${jar_attr_arr[0]}
# 根据配置参数启动
case ${jar_attr_arr[0]} in
1)
cd $current_path/jar/jysp-da/${jar_attr_arr[1]}
nohup $current_path/jar/$javarun --L java -Xms${jar_attr_arr[2]} -Xmx${jar_attr_arr[3]} -jar $start_jar_name >/dev/null 2>&1 &
;;
2)
cd $current_path/jar/jysp_cruise/${jar_attr_arr[1]}
case ${jar_attr_arr[4]} in
1)
nohup $current_path/jar/$javarun --L java -Xms${jar_attr_arr[2]} -Xmx${jar_attr_arr[3]} -jar $start_jar_name >/dev/null 2>&1 &
;;
*)
# 指定配置文件位置
BOOTSTRAP_HOME=/home/jysp/workspace/bin/jar/jysp_cruise
nohup $current_path/jar/$javarun --L java -Xms${jar_attr_arr[2]} -Xmx${jar_attr_arr[3]} -jar $start_jar_name --spring.config.location=classpath:/,${BOOTSTRAP_HOME}/bootstrap.yml >/dev/null 2>&1 &
esac
esac
sleep 5
pid_java=`ps -ef | grep "$start_jar_name" | grep -v grep | grep -v "java_runsv_" | awk '{print $2}'`
if [ "X$pid_java" == "X" ]
then
echo "'$start_jar_name'未运行"
else
echo "'$start_jar_name'启动成功,PID:$pid_java"
fi
}
################################################
# 选择服务是动作:停止jar包
################################################
# 参数一:serv_id
################################################
function java_stop(){
local stop_jar_name=${javasv[$(($1-1))]}
pid_runsv=`ps -ef | grep "$stop_jar_name" | grep -v grep | grep "java_runsv_" | awk '{print $2}'`
if [ "X$pid_runsv" == "X" ]
then
echo "$stop_jar_name 的java_runsv未运行"
else
kill -9 $pid_runsv
if [ "$?" == "0" ]
then
echo "$stop_jar_name 的java_runsv停止成功"
fi
fi
sleep 2
pid_java=`ps -ef | grep "$stop_jar_name" | grep -v grep | grep -v "java_runsv_" | awk '{print $2}'`
if [ "X$pid_java" == "X" ]
then
echo "$stop_jar_name 未运行"
else
kill -9 $pid_java
if [ "$?" == "0" ]
then
echo "$stop_jar_name 停止成功"
fi
fi
}
################################################
# 服务菜单
################################################
# 选择服务
#################################################
function servi(){
# 表格显示jar包列表菜单
local length=${#javasv[@]}
table=""
setTableRow "序号" "软件"
for ((i=0; i<$length; i++))
do
setTableRow "$(($i+1))" "${javasv[$i]}"
done
setTable ${table}
read -p "请输入序号[1-$length],多个时以逗号(英文逗号)间隔:" serv
# 获取用户输入的序号,按照","号分割存入到数组choose_serv_arr中
IFS=',' read -ra choose_serv_arr <<< "$serv"
# 数组去重
sorted_serv_arr=($(printf "%s\n" "${choose_serv_arr[@]}" | sort | uniq))
# 复制数组:菜单显示
serv_arr_copy_show=("${sorted_serv_arr[@]}")
serv_arr_copy_sure=("${sorted_serv_arr[@]}")
serv_arr_copy_option=("${sorted_serv_arr[@]}")
# 显示操作菜单
option_arr=("启动" "停止" "重启")
while true
do
local option_length=${#option_arr[@]}
table=""
for serv_id in "${serv_arr_copy_show[@]}"; do
serv_name=${javasv[$(($serv_id-1))]}
setTableRow "$serv_id" "$serv_name"
done
setTableRow "序号" "动作"
for ((i=0; i<$option_length; i++))
do
setTableRow "$(($i+1))" "${option_arr[$i]}"
done
setTable ${table}
#echo -e "\n请为$5选择:\n1:启动 2:停止 3:重启"
read -p "请输入序号[1-$option_length]:" sure
if [ "$sure" == "1" -o "$sure" == "2" -o "$sure" == "3" ]
then
option_id=$sure
option_name=${option_arr[$(($sure-1))]}
break
fi
done
table=""
for serv_id in "${serv_arr_copy_sure[@]}"; do
serv_name=${javasv[$(($serv_id-1))]}
setTableRow "$serv_id" "$serv_name"
done
setTableRow "动作" "$option_name"
setTable ${table}
# 根据输入启动操作jar包
for serv_id in "${serv_arr_copy_option[@]}"; do
serv_name=${javasv[$(($serv_id-1))]}
# 调用操作方法
option_sure $option_id $serv_id
done
}
case $1 in
"pid")
service_pid
;;
*)
servi
;;
esac
exit 0