
# 当前需要发布的应用名称,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= 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= # 调试端口 debug_port= # 关闭服务 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= 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= 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 $log_level_info } # 打印调试日志 function log_debug() { log $log_level_debug } # 打印错误日志 function log_error() { log $log_level_error } # 打印日志 function log() { level= if test $level -le $log_level; then level_name=$(get_level_name $level) msg="[$level_name][$(date +%Y-%m-%d" "%H:%M:%S)]" # 输出日志到日志文件 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
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)