替换jar包之中的文件通过-u命令 unzip解压

博客介绍了jar相关命令的使用方法,可对jar包进行处理,替换其中的相关文件。所有命令通过组合而来,如'jar -xvf'可从指定目录取出指定文件并显示过程,'jar -uvf0'能更新包中指定目录的指定文件,不压缩且显示过程。

jar 相关命令 

使用方法通过jar的相关命令对jar包进行处理替换其中的相关文件所有的命令都是通过组合而来比如

jar -xvf  包名.jar BOOT-INF/lib/文件名以及目录   

意思是从指定的目录中取出指定的文件并显示过程

jar -uvf0 包名.jar BOOT-INF/lib/文件名以及目录

意思是更新包中的指定目录的指定文件不压缩而且显示过程

 

 

#!/bin/bash ## 环境变量 #### 常用参数配置 localIP=$(ifconfig enp3s0 | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | head -n 1) # 备份源目录 appdir="/app" # 工程备份目录 bakdir_base="/app/backup/pack_bak" # 工程新Jar上传目录 packdir="/iamp/iamp_pack" # 当前时间 yyyyMMdd_HHmm datedir=$(date +%Y%m%d)_$(date +%H%M) # 启动服务时间间隔 starttime=10s # 检测服务时间间隔 insptime=5s # 检测次数 inspcnt=20 #### 定义微服务的基本信息 jar启动路径 jar名 占用端口 单应用最小运行内存 单应用最大运行内存 # 定义所有可能的服务 declare -A services # pvbank服务 services["pvbank_auth"]="/app/pvbank/pvbank-auth-service pvbank-auth-service.jar 8102 -Xms512m -Xmx1024m pvbank" services["pvbank_gs"]="/app/pvbank/pvbank-gs-service pvbank-gs-service.jar 9218 -Xms512m -Xmx1024m pvbank" services["pvbank_general"]="/app/pvbank/pvbank-general-service pvbank-general-service.jar 8106 -Xms512m -Xmx1024m pvbank" services["pvbank_thirdparty"]="/app/pvbank/pvbank-thirdparty-service pvbank-thirdparty-service.jar 8103 -Xms512m -Xmx1024m pvbank" services["pvbank_workflow"]="/app/pvbank/pvbank-workflow-service pvbank-workflow-service.jar 8104 -Xms512m -Xmx1024m pvbank" services["pvbank_param"]="/app/pvbank/pvbank-param-service pvbank-param-service.jar 8100 -Xms512m -Xmx1024m pvbank" services["pvbank_batch"]="/app/pvbank/pvbank-batch-service pvbank-batch-service.jar 8105 -Xms512m -Xmx1024m pvbank" services["pvbank_comm"]="/app/pvbank/pvbank-comm-service pvbank-comm-service.jar 8101 -Xms512m -Xmx1024m pvbank" services["pvbank_authcenter"]="/app/pvbank/pvbank-authcenter-service pvbank-authcenter-service.jar 8010 -Xms512m -Xmx1024m pvbank" services["pvbank_gateway"]="/app/pvbank/pvbank-gateway-service pvbank-gateway-service.jar 9011 -Xms512m -Xmx1024m pvbank" # platform服务 services["sps_thirdparty"]="/app/platform/sps-thirdparty-service sps-thirdparty-service.jar 30003 -Xms512m -Xmx1024m platform" services["sps_batch"]="/app/platform/sps-batch-service sps-batch-service.jar 30004 -Xms512m -Xmx1024m platform" services["platform_risk"]="/app/platform/platform-risk-service platform-risk-service.jar 8009 -Xms512m -Xmx1024m platform" services["sps_buss"]="/app/platform/sps-buss-service sps-buss-service.jar 30001 -Xms512m -Xmx1024m platform" services["platform_authcenter"]="/app/platform/platform-authcenter-service platform-authcenter-service.jar 8001 -Xms512m -Xmx1024m platform" services["platform_auth"]="/app/platform/platform-auth-service platform-auth-service.jar 8006 -Xms512m -Xmx1024m platform" services["platform_rule"]="/app/platform/platform-rule-service platform-rule-service.jar 8003 -Xms512m -Xmx1024m platform" services["platform_comm"]="/app/platform/platform-comm-service platform-comm-service.jar 8007 -Xms512m -Xmx1024m platform" services["platform_param"]="/app/platform/platform-param-service platform-param-service.jar 8008 -Xms512m -Xmx1024m platform" services["platform_gateway"]="/app/platform/platform-gateway-service platform-gateway-service.jar 9001 -Xms512m -Xmx1024m platform" #### 定义服务器的基本信息 ip地址 active配置 运行服务列表 # 服务器配置 declare -A servers # pvbank服务器 servers["50.82.48.10"]="uat pvbank_auth pvbank_gs pvbank_general pvbank_thirdparty pvbank_workflow pvbank_param pvbank_batch pvbank_comm pvbank_authcenter pvbank_gateway" # platform服务器 servers["50.82.48.14"]="uat sps_thirdparty sps_batch platform_risk sps_buss platform_authcenter platform_auth platform_rule platform_comm platform_param platform_gateway" servers["50.82.32.12"]="ssl sps_thirdparty sps_batch platform_risk sps_buss platform_authcenter platform_auth platform_rule platform_comm platform_param platform_gateway" # 新增SIT服务器 (同时部署PVBank和Platform) servers["50.82.32.13"]="sit pvbank_auth pvbank_gs pvbank_general pvbank_thirdparty pvbank_workflow pvbank_param pvbank_batch pvbank_comm pvbank_authcenter pvbank_gateway sps_thirdparty sps_batch platform_risk sps_buss platform_authcenter platform_auth platform_rule platform_comm platform_param platform_gateway" ## 获取本机服务器配置 if [ -z "${servers[$localIP]}" ]; then echo "$localIP:$(date +%Y-%m-%d\ %H:%M:%S) 未获取到本机服务器配置信息!" exit 1 fi serverInfo=(${servers[$localIP]}) serverInfo_Profile=${serverInfo[0]} serverInfo_AppList=${serverInfo[@]:1} echo "$localIP:参数配置如下:" echo "Profile: $serverInfo_Profile" echo "AppList: ${serverInfo_AppList[@]}" #### 获取用户输入的命令参数 ## 获取第一参数(控制服务起停命令) param_option="$1" ## 获取第二参数(自定义启停服务列表),如果没传入值则根据服务器配置信息起停相关服务 param_appList=${@:2} if [ ! -n "$param_appList" ]; then param_appList=$serverInfo_AppList fi #### 执行用户命令 echo "" case "$param_option" in backup) # 确定备份目录 service_types=() for app in $param_appList; do appInfo=(${services[$app]}) service_type=${appInfo[5]} if [[ -n "$service_type" && ! " ${service_types[@]} " =~ " $service_type " ]]; then service_types+=("$service_type") fi done if [ ${#service_types[@]} -eq 0 ]; then echo "无法确定服务类型,无法备份" exit 1 fi # 创建临时备份目录 tempdir="$bakdir_base/$localIP/${service_types[0]}_bak_$datedir" if [ ${#service_types[@]} -gt 1 ]; then tempdir="$bakdir_base/$localIP/multi_bak_$datedir" fi mkdir -p "$tempdir" echo "$localIP:开始备份服务文件到 $tempdir" web_backed=false # 处理每种服务类型 for stype in "${service_types[@]}"; do case "$stype" in pvbank) # 备份pvbank目录下的jar和yml文件 echo "$localIP:备份pvbank目录下的jar和yml文件..." find "$appdir/pvbank" -type f \( -name "*.jar" -o -name "*.yml" \) -exec cp --parents {} "$tempdir" \; # 备份web目录(仅首次需要) if ! $web_backed; then echo "$localIP:备份web目录下的dist文件夹..." if [ -d "$appdir/web/pvbank-operation-web/dist" ]; then mkdir -p "$tempdir/web/pvbank-operation-web" cp -r "$appdir/web/pvbank-operation-web/dist" "$tempdir/web/pvbank-operation-web/" else echo "$localIP:未找到web/dist目录,跳过web备份" fi web_backed=true fi ;; platform) # 备份platform目录下的jar和yml文件 echo "$localIP:备份platform目录下的jar和yml文件..." find "$appdir/platform" -type f \( -name "*.jar" -o -name "*.yml" \) -exec cp --parents {} "$tempdir" \; ;; *) echo "未知的服务类型: $stype" continue ;; esac done echo "$localIP:$tempdir 备份成功!" echo "备份内容:" for stype in "${service_types[@]}"; do echo "- $stype: 含.jar和.yml文件" done if [[ " ${service_types[@]} " =~ " pvbank " ]]; then echo "- web: 含pvbank-operation-web/dist目录内容" fi ;; update) ## 替换新应用 #成功更新Jar的app列表 sucessupdateapplist="" #未成功更新Jar的app列表 failupdateapplist="" #Jar新版本应用上传路径(配上根目录,获取绝对路径) appInfo_packdir="/iamp/iamp_pack" # 服务类型检测 service_types=() web_handled=false # 确保Web备份只执行一次 # 获取当前日期时间 current_date=$(date +%Y%m%d) current_datetime=$(date +%Y%m%d_%H%M) echo "$localIP:--------$(date +%Y-%m-%d\ %H:%M:%S) 资源备份更新开始---------------" echo "" # 检测服务类型 for app in $param_appList; do appInfo=(${services[$app]}) stype=${appInfo[5]} if [[ -n "$stype" && ! " ${service_types[@]} " =~ " $stype " ]]; then service_types+=("$stype") fi done if [ ${#service_types[@]} -eq 0 ]; then echo "无法确定服务类型,无法执行更新" exit 1 fi # 创建基础备份目录 base_bakdir="$bakdir_base/$localIP/$current_date/$current_datetime" mkdir -p "$base_bakdir" # 只有当 PVBank 是服务类型之一时才处理 web 更新/备份 if [[ " ${service_types[@]} " =~ " pvbank " ]] && ! $web_handled; then web_zip="dist.zip" web_target="/app/web/pvbank-operation-web" web_source_path="${appInfo_packdir}/web/pvbank-operation-web/${web_zip}" if [ -f "$web_source_path" ]; then echo "$localIP:发现web压缩,开始处理..." # 创建含 pvbank-operation-web 的完整备份路径 web_bakdir="$base_bakdir/web/pvbank-operation-web" mkdir -p "$web_bakdir" # 备份 dist 目录内容(保持完整路径结构) if [ -d "$web_target/dist" ]; then echo "$localIP:备份现有web目录..." # 创建 dist 目录 mkdir -p "$web_bakdir/dist" # 复制所有文件和子目录 cp -r "$web_target/dist/." "$web_bakdir/dist/" echo "$localIP:web目录备份完成:$web_bakdir/dist" else echo "$localIP:未找到dist目录,跳过web备份" fi # 更新 web 目录 echo "$localIP:解压web压缩到$web_target..." mkdir -p "$web_target" unzip -o "$web_source_path" -d "$web_target" >/dev/null 2>&1 echo "$localIP:web压缩解压完成并覆盖原有内容" # 设置标志位确保只处理一次 web_handled=true else echo "$localIP:未找到web压缩$web_source_path,跳过web更新" fi fi # 服务更新 for app in $param_appList do ## 获取服务信息 appInfo=(${services[$app]}) ## Jar启动路径 appInfo_dir=${appInfo[0]} ## Jar名 appInfo_jarname=${appInfo[1]} ## 服务类型 appInfo_type=${appInfo[5]} ## 参数校验 if [ ! -n "$appInfo_dir" ] || [ ! -n "$appInfo_jarname" ] || [ ! -n "$appInfo_type" ]; then echo "$localIP:$app 应用参数配置缺失或错误!" failupdateapplist=$failupdateapplist$app" " continue fi ## 判断应用文件夹是否存在,不存在则新建 if [ ! -d $appInfo_dir ]; then mkdir -p $appInfo_dir fi # 根据服务名称确定源目录 service_dir_name=$(basename $appInfo_dir) source_dir="${appInfo_packdir}/${appInfo_type}/${service_dir_name}" # 检查源目录是否存在 if [ ! -d "$source_dir" ]; then failupdateapplist=$failupdateapplist$app" " echo "$localIP:未找到$app源目录$source_dir,本次跳过$app替换" continue fi # 创建应用备份目录 app_bakdir="$base_bakdir/$appInfo_type/$app" mkdir -p "$app_bakdir" # 备份现有文件 echo "$localIP:开始备份$app文件到$app_bakdir..." file_count=0 find "$appInfo_dir" -maxdepth 1 -type f \( -name "*.jar" -o -name "*.sh" -o -name "*.xml" -o -name "*.yml" \) -exec cp -p "{}" "$app_bakdir/" \; -exec sh -c 'echo -n "."' \; if [ $? -eq 0 ]; then file_count=$(ls "$app_bakdir" | wc -l) echo "" echo "$localIP:$app 备份完成,共备份 $file_count 个文件" else echo "$localIP:$app 备份过程中出错" fi # 执行替换 echo "$localIP:开始从$source_dir更新$app文件..." file_count=0 find "$source_dir" -maxdepth 1 -type f \( -name "*.jar" -o -name "*.sh" -o -name "*.xml" -o -name "*.yml" \) -exec cp -f "{}" "$appInfo_dir/" \; -exec sh -c 'echo -n "."' \; if [ $? -eq 0 ]; then file_count=$(find "$source_dir" -maxdepth 1 -type f \( -name "*.jar" -o -name "*.sh" -o -name "*.xml" -o -name "*.yml" \) | wc -l) echo "" echo "$localIP:$app 更新完成,共更新 $file_count 个文件" sucessupdateapplist=$sucessupdateapplist$app" " else echo "$localIP:$app 更新过程中出错" failupdateapplist=$failupdateapplist$app" " fi done # 输出备份结果 echo "$localIP:备份文件已保存至以下目录:" echo "- 服务备份: $base_bakdir" if $web_handled; then echo "- web备份: $base_bakdir/web/pvbank-operation-web/dist" fi echo "备份内容说明:" echo "- 服务目录: 备份.jar、.sh、.xml和.yml文件" if $web_handled; then echo "- web: 备份pvbank-operation-web/dist目录内容" fi echo "" echo "$localIP:已成功替换的服务: $sucessupdateapplist" echo "$localIP:未成功替换的服务: $failupdateapplist" echo "" echo "$localIP:--------$(date +%Y-%m-%d\ %H:%M:%S) 资源备份更新结束---------------" echo "" ;; start) echo "$localIP:--------$(date +%Y-%m-%d\ %H:%M:%S) 开始启动威海银行产业资产平台服务---------------" echo "" param_appList_success=() for app in $param_appList do ## 获取服务信息 appInfo=(${services[$app]}) echo "$localIP:$(date +%Y-%m-%d\ %H:%M:%S) 开始启动 $app" #Jar启动路径(配上根目录,获取绝对路径) appInfo_dir=${appInfo[0]} #Jar名 appInfo_jarname=${appInfo[1]} #Jar启动端口 appInfo_port=${appInfo[2]} #Jar启动最小内存 appInfo_Xms=${appInfo[3]} #Jar启动最大内存 appInfo_Xmx=${appInfo[4]} #参数校验 if [ ! -n "$appInfo_dir" ] || [ ! -n "$appInfo_jarname" ] || [ ! -n "$appInfo_port" ] || [ ! -n "$appInfo_port" ] || [ ! -n "$appInfo_Xms" ] || [ ! -n "$appInfo_Xmx" ]; then echo "$localIP:$app 应用参数配置缺失或错误!" exit 1 fi ##判断是否存在该应用Jar if [ ! -f "$appInfo_dir/$appInfo_jarname" ]; then echo "$localIP:未找到$app应用Jar,本次跳过部署$app!" continue fi ##判断该应用是否已运行 appInfo_portpid=`lsof -i:$appInfo_port|grep "LISTEN"|awk '{print $2}'` if [ -n "$appInfo_portpid" ]; then echo "$localIP:$app已启动,本次启动已跳过!" continue fi ##启动 $app echo "$localIP:开始执行:cd $appInfo_dir && nohup java $appInfo_Xms $appInfo_Xmx -jar -Dspring.profiles.active=$serverInfo_Profile $appInfo_jarname > $appInfo_dir/nohup.out 2>&1 &" cd "$appInfo_dir" && nohup java $appInfo_Xms $appInfo_Xmx -jar -Dspring.profiles.active=$serverInfo_Profile "$appInfo_jarname" > nohup.out 2>&1 & param_appList_success+=("$app") echo "睡眠10秒后启动下个服务..." sleep $starttime done # 循环检测 all_services_up=false cnt=0 while [ "$all_services_up" = false ]; do not_started_services=() for app in "${param_appList_success[@]}"; do ## 获取服务信息 appInfo=(${services[$app]}) #Jar启动端口 appInfo_port=${appInfo[2]} appInfo_portpid=`lsof -i:$appInfo_port|grep "LISTEN"|awk '{print $2}'` if ! [ -n "$appInfo_portpid" ]; then not_started_services+=("$app") else echo "$app已启动成功!" fi done if [ ${#not_started_services[@]} -eq 0 ]; then echo "所有服务均已启动成功!" all_services_up=true elif [[ $inspcnt -eq $cnt ]]; then echo "以下服务$cnt次检测内尚未启动,请检查:${not_started_services[*]}" exit 1 else echo "以下服务尚未启动:${not_started_services[*]},等待5秒后再次检查" cnt=$(($cnt+1)) param_appList_success=("${not_started_services[@]}") sleep $insptime # 等待5秒后再次检查 fi done echo "" echo "$localIP:--------$(date +%Y-%m-%d\ %H:%M:%S) 威海银行产业资产平台服务启动成功---------------" ;; stop) echo "$localIP:--------$(date +%Y-%m-%d\ %H:%M:%S) 开始关闭威海银行产业资产平台服务---------------" for app in $param_appList do ## 获取服务信息 appInfo=(${services[$app]}) echo "$localIP:$(date +%Y-%m-%d\ %H:%M:%S) 开始停止 $app" #Jar名 appInfo_jarname=${appInfo[1]} #Jar启动端口 appInfo_port=${appInfo[2]} #参数校验 if [ ! -n "$appInfo_jarname" ] || [ ! -n "$appInfo_port" ]; then echo "$localIP:$app 应用参数配置缺失或错误!" exit 1 fi ##根据grep规则,不能直接匹配appInfo_jarname,需要做一些调整,将*.jar替换成.*.jar 如: ps -ef | grep ags-.*.jar | grep -v "grep -v "grep" | awk '{print $2}' appInfo_jarname="${appInfo_jarname//'*.jar'/'.*.jar'}" ## 根据java运行获取进程编号 appInfo_namepid=`ps -ef | grep -w $appInfo_jarname | grep -v "grep" | awk '{print $2}'` ## 该应用已停止运行 if [ ! -n "$appInfo_namepid" ]; then echo "$localIP:$app 进程不存在,本次任务已跳过!" continue fi ## 关闭 $app until [ ! -n "$appInfo_namepid" ] do echo "$localIP:$app 目前占用的进程号是:$appInfo_namepid" kill -9 $appInfo_namepid sleep 1s appInfo_namepid=`ps -ef | grep -w $appInfo_jarname | grep -v "grep" | awk '{print $2}'` done ## 根据应用端口获取进程编号 appInfo_portpid=`lsof -i:$appInfo_port|grep "LISTEN"|awk '{print $2}'` if [ -n "$appInfo_portpid" ]; then echo "$localIP:$app 端口未占用,本次任务已跳过!" continue fi ## 关闭 $app until [ ! -n "$appInfo_portpid" ] do echo "$localIP:$app 目前占用的进程号是:$appInfo_portpid" kill -9 $appInfo_portpid sleep 1s appInfo_portpid=`lsof -i:$appInfo_port|grep "LISTEN"|awk '{print $2}'` done echo "$localIP:$(date +%Y-%m-%d\ %H:%M:%S) $app 停止运行" done echo "" echo "$localIP:--------$(date +%Y-%m-%d\ %H:%M:%S) 威海银行产业资产平台服务服务关闭成功---------------" ;; status) echo "$localIP:--------$(date +%Y-%m-%d\ %H:%M:%S) 服务状态检查开始---------------" echo "" # 表头 printf "%-20s %-10s %-10s %-15s %-15s\n" "服务名称" "端口" "状态" "进程ID" "内存使用" echo "----------------------------------------------------------------" for app in $param_appList do ## 获取服务信息 appInfo=(${services[$app]}) ## 服务名称 app_name=$app ## Jar启动端口 app_port=${appInfo[2]} ## Jar名 app_jarname=${appInfo[1]} # 检查端口占用情况 port_pid=$(lsof -i:$app_port | grep "LISTEN" | awk '{print $2}') # 检查进程情况 app_jarname_for_grep="${app_jarname//'*.jar'/'.*.jar'}" process_pid=$(ps -ef | grep -w $app_jarname_for_grep | grep -v "grep" | awk '{print $2}') # 确定服务状态 if [ -n "$port_pid" ] || [ -n "$process_pid" ]; then status="运行中" pid=${port_pid:-$process_pid} # 获取内存使用情况 if [ -n "$pid" ]; then mem_usage=$(ps -p $pid -o rss= | awk '{printf "%.2f MB", $1/1024}') else mem_usage="N/A" fi else status="未运行" pid="N/A" mem_usage="N/A" fi # 输出服务状态信息 printf "%-20s %-10s %-10s %-15s %-15s\n" "$app_name" "$app_port" "$status" "$pid" "$mem_usage" done echo "" echo "$localIP:--------$(date +%Y-%m-%d\ %H:%M:%S) 服务状态检查完成---------------" ;; *) echo "===参数错误,请检查执行语句===" echo "可用参数:" echo "backup - 备份服务" echo "update - 更新服务" echo "start - 启动服务" echo "stop - 停止服务" echo "status - 查看服务状态" ;; esac exit 0 修改备份功能,现在新增一个web备份与替换,原来的web文件夹格式:web/pvbank-operation-web/dist.zip,现在这个,web/sps-operation-web/dist.zip,这样的也能备份替换,整体目录结构:web/pvbank-operation-web/dist.zip| sps-operation-web/dist.zip
最新发布
12-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值