在linux上热发布java.jar

1 篇文章 0 订阅
# 配置项
app_name="demo"
# 本地机器的ip
app_host_ip="192.168.174.128"
# 端口信息 当前jar 启动几个端口,多个用逗号隔开
app_port_str="8081"
# 调试端口,多个用逗号隔开
app_debug_port_str="7081"
# java options
app_options=""
# 测试程序启动成功的url
app_test_url="/workplatform/doc.html"
# 多久检查一次app是否启动成功
app_check_time=10
# 最多检查几次,如果在最多检查次数内还没有成功启动 那么就直接结束脚本并输出错误日志
app_max_check=30
# 是否备份数据 1 备份 0 不备份
app_back_enabled=0

# nginx 的配置文件
# 是否进行nginx 切换,1 进行切换,0不进行切换,当应用的配置项只有一个服务的时候,默认0
nginx_enabled=1
# nginx 的根目录
nginx_home=/usr/local/nginx
# nginx 的配置文件位置
nginx_conf_name=$nginx_home/conf/nginx.conf
# nginx 执行文件的位置
nginx_sbin=$nginx_home/sbin/nginx
# nginx 执行reload 命令之后等待多少秒再继续往下执行
nginx_reload_wait_time=10
# 脚本日志级别  1 log_info 级别  5 debug
log_level_debug=5
log_level_info=1
log_level_error=0
log_level=$log_level_info

deploy_log="deploy"
# 主函数
function main() {
  # 先检查环境
  check_environment
  # 启动
  start
  # 备份
  backup
}
# 检查环境是否已经准备好了
function check_environment() {
  # 修改之前发布日志的名字
  mv -f $deploy_log.log $deploy_log.log.bak
  mkdir_if_not_exist $app_name
  app_port_arr=(${app_port_str//,/ })
  # 循环所有的文件夹
  for ((i = 0; i < ${#app_port_arr[@]}; ++i)); do
    # 创建每个端口的文件夹
    mkdir_if_not_exist $app_name/${app_port_arr[i]}
    # 创建日志文件夹
    mkdir_if_not_exist $app_name/${app_port_arr[i]}"/logs"
  done

  # 检查文件夹
  dirs=("back" "deploy_logs")
  # 循环所有的文件夹
  for ((i = 0; i < ${#dirs[@]}; ++i)); do
    mkdir_if_not_exist $app_name/${dirs[i]}
  done
}
# 创建文件夹当不存在的时候
function mkdir_if_not_exist() {
  dir=$1
  if [ ! -d "$dir" ]; then
    $(mkdir $dir)
    log_debug "创建文件夹:"$dir
  else
    log_debug "文件夹已存在:"$dir
  fi
}

# 启动
function start() {
  # 切割端口
  app_port_arr=(${app_port_str//,/ })
  app_debug_port_arr=(${app_debug_port_str//,/ })
  # 获取数组的长度
  len=${#app_port_arr[@]}
  log_debug "数组长度"$len
  # 如果数组长度为1的话 那么默认不打开nginx
  if [ $len == 1 ];then
    nginx_enabled=0
  fi
  # 循环执行 一个一个的启动
  for ((i = 0; i < len; ++i)); do
    # 当前启动的端口
    cur_port=${app_port_arr[i]}
    cur_debug_port=${app_debug_port_arr[i]}
    log_debug "发布服务:"$cur_port
    if test $i -eq 0; then
      log_debug "第一个端口直接关掉"
      disable_nginx_server $app_host_ip:$cur_port
      # 重新加载配置文件
      reload_nginx_server
      # 休眠5秒钟再进行下一个动作
      sleep $nginx_reload_wait_time
    else
      pre_idx=$i-1
      # 下一个启动的端口
      pre_port=${app_port_arr[pre_idx]}
      # 取消当前端口 运行上一个端口被访问
      replace_nginx_server $cur_port $pre_port
    fi
    # 发布当前端口
    start_app $cur_port $cur_debug_port
  done
  # 开启所有的nginx server
  enable_all_nginx_server
}

# 启动服务
function start_app() {
  # 启动端口
  app_port=$1
  # 调试端口
  debug_port=$2
  # 关闭服务
  stop_app $app_port $debug_port
  # 日志文件名
  log_file="$app_name/$app_port/logs/catalina.log"
  # 拷贝当前的jar到目录中
  cur_app_name=$app_name/$app_port/$app_name.jar
  cp $app_name.jar $cur_app_name
  # 创建日志文件
  touch $log_file
  log_info "开始启动![appName:"$app_name","$app_host_ip:$app_port",日志文件:"$log_file"]"
  sleep $app_check_time
  # 拷贝一个启动包到
  # 启动命令
  nohup java -Xdebug -Xrunjdwp:transport=dt_socket,address=$debug_port,server=y,suspend=n,$app_options -jar ${cur_app_name} --server.port=$app_port >$log_file 2>&1 &
  sleep $app_check_time
  command="curl -I -m 10 -o /dev/null -s -w %{http_code} http://"$app_host_ip":"$app_port"/"$app_test_url
  #计数器
  count=0
  while :; do
    if test $count -eq $app_max_check; then
      # 如果当前检查次数已经超过了最大值 那么直接退出shell
      log_error "服务启动异常,请检查启动日志![appName:"$app_name","$app_host_ip:$app_port",日志文件:"$log_file"]"
      exit
    fi
    status=$($command)
    if [ $status == 200 ]; then
      log_info "[$app_name]$app_host_ip:$app_port启动完成..."
      break
    else
      let count++
      log_info "[$count][$app_name]$app_host_ip:$app_port启动中..."
    fi
    sleep $app_check_time
  done
}
# 停用服务
function stop_app() {
  # 启动端口
  app_port=$1
  # 调试端口
  debug_port=$2
  command=$(ps -ef | grep $app_name | grep $app_port)
  # 关闭服务
  if [ "$command" ]; then
    log_info "关闭服务![appName:"$app_name",端口:"$app_port"]"
    ps -ef | grep $app_name | grep $app_port | grep -v 'grep' | awk '{print $2}' | xargs kill -9
  else
    log_info "服务未启动![appName:"$app_name",端口:"$app_port"]"
  fi
}

# 备份程序
function backup() {
  if [ $app_back_enabled == 1 ];then
    back_name=$app_name/back/$(date +%Y%m%d_%H%M%S).jar
    cp $app_name.jar $back_name
    log_info "程序已备份:"${back_name}
  fi
  # 备份发布日志
  cp $deploy_log.log $app_name/deploy_logs/$(date +%Y%m%d_%H%M%S).log
}

# 逐个切换Nginx
function replace_nginx_server() {
  if [ $nginx_enabled == 1 ]; then
    # 停用一个端口
    disable_nginx_server $app_host_ip:$1
    # 启用一个
    enable_nginx_server $app_host_ip:$2
    # 重新加载配置文件
    reload_nginx_server
    # 休眠5秒钟再进行下一个动作
    sleep $nginx_reload_wait_time
  fi
}

# 开启所有配置了的nginx服务
function enable_all_nginx_server() {
  if [ $nginx_enabled == 1 ]; then
    app_port_arr=(${app_port_str//,/ })
    # 循环执行 一个一个的启动
    for ((i = 0; i < ${#app_port_arr[@]}; ++i)); do
      # 当前启动的端口
      cur_port=${app_port_arr[i]}
      enable_nginx_server $app_host_ip:$cur_port
    done
    # 重新加载配置文件
    reload_nginx_server
    log_info '已经打开所有的nginx配置'
  fi
}

# 停用nginx 中配置的server
function disable_nginx_server() {
  if [ $nginx_enabled == 1 ];then
    server=$1
    check_is_disabled=$(awk "/#server $server/{print NR}" $nginx_conf_name)
    if [ ! "$check_is_disabled" ]; then
      log_debug "准备停用nginx配置"$server
      # 修改配置文件
      sed -i "s/server $server/#server $server/g" $nginx_conf_name
    fi
    log_info "已停用"$server
   fi
}

# 启用nginx 中配置的server
function enable_nginx_server() {
  if [ $nginx_enabled == 1 ];then
    server=$1
    check_is_enabled=$(awk "/#server $server/{print NR}" $nginx_conf_name)
    if [ "$check_is_enabled" ]; then
      log_debug "准备启用nginx配置"$server
      # 修改配置文件
      sed -i "s/#server $server/server $server/g" $nginx_conf_name
    fi
    log_info "已启用"$server
   fi
}

# 重新加载nginx
function reload_nginx_server() {
  if [ $nginx_enabled == 1 ];then
    # 重新加载nginx
    $nginx_sbin -s reload
    log_info '重新加载nginx'
  fi
}

# 打印日志
function log_info() {
  log $1 $log_level_info
}

# 打印调试日志
function log_debug() {
  log $1 $log_level_debug
}

# 打印错误日志
function log_error() {
  log $1 $log_level_error
}

# 打印日志
function log() {
  level=$2
  if test $level -le $log_level; then
    level_name=$(get_level_name $level)
    msg="[$level_name][$(date +%Y-%m-%d" "%H:%M:%S)]"$1
    # 输出日志到日志文件
    echo $msg >>$deploy_log.log
    # 输出日志到界面
    echo $msg
  fi
}

# 获取日志级别的名称
function get_level_name() {
  if test $1 -eq $log_level_info; then
    echo "info"
  elif test $1 -eq $log_level_debug; then
    echo "debug"
  elif test $1 -eq $log_level_error; then
    echo "error"
  else
    echo ""
  fi
}
# 执行main函数.
main

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值