# 实战脚本示例

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
更新时间: 2024年2月23日星期五凌晨12点17分