IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 在linux上热发布java.jar -> 正文阅读

[系统运维]在linux上热发布java.jar

# 当前需要发布的应用名称,jar包应该放在当前脚本的同级目录,并且命名为 $app_name.jar
app_name="demo"
# 本地机器的ip
app_host_ip="192.169.75.129"
# 端口信息 当前jar 启动几个端口
app_port_str="8081,8082"
# 调试端口
app_debug_port_str="7081,7082"
# java options
app_options=""
# 测试程序启动成功的url 运行的时候会自动拼上 http://app_host_ip:app_port/app_test_url
app_test_url="/demo/doc.html"
# 多久检查一次app是否启动成功,单位秒
app_check_time=10
# 最多检查几次,如果在最多检查次数内还没有成功启动 那么就直接结束脚本并输出错误日志
app_max_check=30

# nginx 的配置文件
# 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
  # 循环执行 一个一个的启动
  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() {
  back_name=$app_name/back/$(date +%Y%m%d_%H%M%S).jar
  cp $app_name.jar $back_name
  log_info "程序已备份:"${back_name}
  # 备份发布日志
  cp $deploy_log.log $app_name/deploy_logs/$(date +%Y%m%d_%H%M%S).log
}

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

# 开启所有配置了的nginx服务
function enable_all_nginx_server() {
  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配置'
}

# 停用nginx 中配置的server
function disable_nginx_server() {
  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
}

# 启用nginx 中配置的server
function enable_nginx_server() {
  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
}

# 重新加载nginx
function reload_nginx_server() {
  # 重新加载nginx
  $nginx_sbin -s reload
  log_info '重新加载nginx'
}

# 打印日志
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

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-29 13:27:02  更:2021-10-29 13:29:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:32:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码