【Shell实战】Linux多节点分发文件

news/2025/3/19 8:36:28/

多节点分发文件

通过shell脚本将跳板机或者软件中转机上的文件,分发至一组目标机器中。

使用前提:

  • 跳板机或者软件中转机与目标集群均配置免密。
  • 目标机器的接收目录拥有足够的大小。

脚本使用说明:

sh distributing_packages.sh /data/gd/distributing /data/software 22

  • 第一个参数为分发文件所在目录所在的绝对路径:/data/gd/distributing
  • 第二个参数为目标机器接收目录所在的绝对路径:/data/software
  • 第三个参数为(可选参数) ssh端口号 要求整个分发机器们统一.22

使用日志输出样例

2023-11-15 17:46:39,273 [INFO ] 参数提示:第一个参数为分发目录所在的绝对路径,第二个参数为目标接收目录所在的绝对路径,第三个参数为(可选参数) ssh端口号 要求整个分发机器们统一.
例如: sh distributing_packages.sh /data/gd/distributing /data/software 22
2023-11-15 17:46:39,275 [INFO ] =================== 安装前检查开始 ===================
2023-11-15 17:46:39,280 [INFO ] =================== 安装前检查完毕 ===================
2023-11-15 17:46:39,665 [INFO ] =================== 分发文件开始 ===================
2023-11-15 17:46:39,672 [INFO ] 正在向[192.168.1.1]发送文件[apache-doris-2.0.2-bin-x64-noavx2.tar.gz]...
2023-11-15 17:47:04,260 [INFO ] 正在向[192.168.1.1]发送文件[apache-doris-2.0.2-bin-x64.tar.gz]...
2023-11-15 17:47:28,916 [INFO ] 正在向[192.168.1.1]发送文件[distributing_config.properties]...
2023-11-15 17:47:29,055 [INFO ] 正在向[192.168.1.1]发送文件[distributing_packages.sh]...
2023-11-15 17:47:29,195 [INFO ] 正在向[192.168.1.1]发送文件[jdk1.8.0_161.tgz]...
2023-11-15 17:47:30,969 [INFO ][192.168.1.1]发送文件完毕
2023-11-15 17:47:30,977 [INFO ] 正在向[192.168.1.2]发送文件[apache-doris-2.0.2-bin-x64-noavx2.tar.gz]...
2023-11-15 17:47:55,485 [INFO ] 正在向[192.168.1.2]发送文件[apache-doris-2.0.2-bin-x64.tar.gz]...
2023-11-15 17:48:19,987 [INFO ] 正在向[192.168.1.2]发送文件[distributing_config.properties]...
2023-11-15 17:48:20,132 [INFO ] 正在向[192.168.1.2]发送文件[distributing_packages.sh]...
2023-11-15 17:48:20,272 [INFO ] 正在向[192.168.1.2]发送文件[jdk1.8.0_161.tgz]...
2023-11-15 17:48:22,036 [INFO ][192.168.1.2]发送文件完毕
2023-11-15 17:48:22,044 [INFO ] 正在向[192.168.1.3]发送文件[apache-doris-2.0.2-bin-x64-noavx2.tar.gz]...
2023-11-15 17:48:46,588 [INFO ] 正在向[192.168.1.3]发送文件[apache-doris-2.0.2-bin-x64.tar.gz]...
2023-11-15 17:49:11,176 [INFO ] 正在向[192.168.1.3]发送文件[distributing_config.properties]...
2023-11-15 17:49:11,323 [INFO ] 正在向[192.168.1.3]发送文件[distributing_packages.sh]...
2023-11-15 17:49:11,470 [INFO ] 正在向[192.168.1.3]发送文件[jdk1.8.0_161.tgz]...
2023-11-15 17:49:13,266 [INFO ][192.168.1.3]发送文件完毕
2023-11-15 17:49:13,269 [INFO ] =================== 分发文件成功 ===================

目标机器的IP存放在配置文件distributing_config.properties中,脚本通过解析配置文件获取它们。

脚本源码:

distributing_packages.sh

#!/bin/bash
# Author                : Donny
# Date                  : 2023/11/15
# Func                  : 软件包分发脚本
#                         例如:sh distributing_packages.sh /data/gd/distributing /data/software 22
########################################################################### ############################## Prameter area ##############################
# 采用绝对地址表示软件包分发的目录,容量至少50G。
distributingPackagePath=$1
# 分发配置文件名
distributingConfigFile="distributing_config.properties"
# 获取本地IP
localIP=$(ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}')
# ssh端口 为可选参数
sshPort=22# 分发目标节点IP
targetIps=""# 分发目标节点的接收目录,容量至少50G。
targetPath=$2if [[ -n "${3}" ]]; thensshPort=${3}
fi# ############################## Buildin function area ##############################
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 日志模块 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# 初始化日志模块
function initLogModule() {# 初始化日志输出logPath=$(pwd)# 脚本日志目录LogFile="$logPath/logs/distributing_package_$(date +%F).log"mkdir -p "${distributingPackagePath}/logs"# 创建日志文件if ! [ -f "${LogFile}" ]; thentouch "$LogFile"fiecho "日志文件为: ${LogFile}"
}# 输出红色高亮字体并标记ERROR
function echo_error() {echo -e "\033[1;31m$1\033[0m"[ -n "${LogFile}" ] && echo "$(date +%F\ %T,%N | cut -c1-23) [ERROR] $1" >>"${LogFile}"
}# 输出默认字体并标记INFO
function echo_info() {echo -e "$1"[ -n "${LogFile}" ] && echo "$(date +%F\ %T,%N | cut -c1-23) [INFO ] $1" >>"${LogFile}"
}# 输出绿色字体并标记INFO
function echo_green() {echo -e "\033[32m$1\033[0m"[ -n "${LogFile}" ] && echo "$(date +%F\ %T,%N | cut -c1-23) [INFO ] $1" >>"${LogFile}"
}
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 日志模块 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<# 获取配置文件内容
function getPropertiesValue() {# check文件是否存在if ! [ -f "${distributingPackagePath}/${distributingConfigFile}" ]; thenecho_error "缺少配置文件[${distributingPackagePath}/${distributingConfigFile}]"exit 1fi# check 文件中是否配置了distributingTargeIpsfile=$(grep 'distributingTargeIps' "${distributingPackagePath}"/"${distributingConfigFile}")if [[ -z "${file}" ]]; thenecho_error "缺少配置项distributingTargeIps"exit 1fi# check distributingTargeIps的合法性targetIps=$(echo "$file" | awk -F "=" '{print $2}' | awk -F "," '{for(i=1;i<=NF;i++) a[i,NR]=$i}END{for(i=1;i<=NF;i++) {for(j=1;j<=NR;j++) printf a[i,j] " ";print ""}}')length1=$(echo "$targetIps" | wc -l)length2=$(echo "$targetIps" | sort -u | wc -l)if [[ "$length1" != "$length2" ]]; thenecho_error "distributingTargeIps中存在IP重复或存在多余分隔符"exit 1fierrorIp=""for ip in ${targetIps}; doif [[ "${ip}" != "${localIP}" ]]; thenssh -p${sshPort} "${ip}" 'mkdir -p '${targetPath}'' &>/dev/null[ "$?" != "0" ] && errorIp="$errorIp"$ip, && continuefidoneif [[ -n "${errorIp}" ]]; thenerrorIp=${errorIp::-1}echo_error "${errorIp}无法ssh"exit 1fi}# ############################## Execute body area ##############################
# 初始化日志
initLogModule
echo_info "参数提示:第一个参数为分发目录所在的绝对路径,第二个参数为目标接收目录所在的绝对路径,第三个参数为(可选参数) ssh端口号 要求整个分发机器们统一.
例如: sh $0 /data/gd/distributing /data/software 22"echo_info "=================== 安装前检查开始 ==================="
current=$(whoami)
# 0.用户检查
if [[ "root" != "$current" ]]; thenecho_error "请使用root用户执行脚本!"exit 1
fi
# 1.检查参数是否齐全
if [[ -z "${distributingPackagePath}" || -z "${targetPath}" ]]; thenecho_error "请输入正确参数:第一个参数为分发目录所在的绝对路径,第二个参数为目标接收目录所在的绝对路径第三个参数为(可选参数) ssh端口号 要求整个集群统一.
例如: sh $0 /data/gd/distributing /data/software 22"exit 1
# 2.检查路径是否非法
elif ! [ -d "${distributingPackagePath}" ]; thenecho_error "目录${distributingPackagePath}不存在"exit 1
fi
echo_green "=================== 安装前检查完毕 ==================="getPropertiesValueerrorflag=0
echo_info "=================== 分发文件开始 ==================="
# 向集群结点分发
for ip in ${targetIps}; doerrorDistribution=""if [[ "${ip}" != "${localIP}" ]]; then# 发送配置文件packageFiles=$(ls ${distributingPackagePath})for file in ${packageFiles}; dosudo scp -P${sshPort} ${distributingPackagePath}/${file} root@${ip}:${targetPath}/${file} &>/dev/null[ "$?" != "0" ] && errorDistribution="$errorDistribution""向[$ip]发送[$file]失败, "doneif [[ -n "${errorDistribution}" ]]; thenerrorflag=1errorDistribution=${errorDistribution}""echo_error "${errorDistribution}"elseecho_info "[${ip}]发送文件完毕"fifidoneif ((${errorflag} == 1)); thenecho_error "=================== 分发文件失败 ==================="exit 1
elseecho_green "=================== 分发文件成功 ==================="
fi# ############################## Return value area ##############################
exit 0

distributing_config.properties

# distributingTargeIps代表软件包需要分发到的IP地址,格式ip1,ip2,ip3
distributingTargeIps=192.168.1.1,192.168.1.2,192.168.1.3

http://www.ppmy.cn/news/1223616.html

相关文章

阿里达摩院开源DAMO-YOLO

1.简介 DAMO-YOLO是一个兼顾速度与精度的目标检测框架&#xff0c;其效果超越了目前的一众YOLO系列方法&#xff0c;在实现SOTA的同时&#xff0c;保持了很高的推理速度。DAMO-YOLO是在YOLO框架基础上引入了一系列新技术&#xff0c;对整个检测框架进行了大幅的修改。具体包括…

自动驾驶-BEV感知综述

BEV感知综述 随着自动驾驶传感器配置多模态化、多源化&#xff0c;将多源信息在unified View下表达变得更加关键。BEV视角下构建的local map对于多源信息融合及理解更加直观简洁&#xff0c;同时对于后续规划控制模块任务的开展也更为方便。BEV感知的核心问题是&#xff1a; …

faiss-gpu安装失败

pip install faiss-gpu1.7.2 --no-cachefaiss-gpu版本需要与python版本相对应&#xff0c;而且python3.9以上版本大概率用不了faiss-gpu&#xff0c;如果自己的python版本过高请降低python版本试试。

合璧之光,共创辉煌|明道云伙伴大会2023圆满结束

2023年11月3日至11月4日&#xff0c;“合璧之光明道云伙伴大会2023”在上海星河湾酒店顺利举行&#xff0c;报名参会人数超过1800人。大会邀请到明道云标杆客户及合作伙伴分享组织落地零代码的经验及各行业领域解决方案&#xff0c;包括越秀集团、豫园股份、远大医药&#xff0…

kotlin--3.集合操作

目录 一.list集合 二.Set集合 三.Map集合 迭代遍历Map集合&#xff1a; 8.hashMap 四.Stream流 1.map 2.filter 3.reduce 4.forEach 5.sorted 6.distinct 7.综合案例 一.list集合 在Kotlin中&#xff0c;常见的List集合类型有以下几种&#xff1a; listOf&…

总结 CNN 模型:将焦点转移到基于注意力的架构

一、说明 在计算机视觉时代&#xff0c;卷积神经网络&#xff08;CNN&#xff09;几十年来一直是主导范式。直到 2021 年 Vision Transformers (ViTs) 出现&#xff0c;这个领域才开始发生变化。现在&#xff0c;是时候采用受 Transformer 架构启发的基于注意力的模型了&#x…

torch - 张量Tensor常见的形式

1.Scalar 通常就是一个数值 x tensor(42.) 输出x&#xff1a; 2.Vector 特征向量 例如&#xff1a;[-5., 2., 0.]在深度学习中通常表示特征&#xff0c;如词向量特征&#xff0c;某一维度特征等 3.Matrix 一般计算的都是矩阵&#xff0c;通常都是多维的。 可以做矩阵的…

【Redis】springboot整合redis(模拟短信注册)

要保证redis的服务器处于打开状态 上一篇&#xff1a; 基于session的模拟短信注册 https://blog.csdn.net/m0_67930426/article/details/134420531 整个流程是&#xff0c;前端点击获取验证码这个按钮&#xff0c;后端拿到这个请求&#xff0c;通过RandomUtil 工具类的方法生…