Centos集群同步文件脚本xsync

第一次使用需要安装rsync

yum -y install rsync

创建执行文件

vi /usr/local/bin/xsync

执行权限

chmod a+x /usr/local/bin/xsync

bash 复制代码
#!/bin/bash

# 获取输出参数,如果没有参数则直接返回
pcount=$#
if [ $pcount -eq 0 ]
then
	echo "no parameter find !";
	exit;
fi

# 获取传输文件名
p1=$1
filename=`basename $p1`
echo "load file $p1 success !"

# 获取文件的绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo "file path is $pdir"

# 获取当前用户(如果想使用root用户权限拷贝文件,在命令后加入-root参数即可)
user=$2
case "$user" in
"-root")
	user="root";;
"")
	user=`whoami`;;
*)
	echo "illegal parameter $user"
	
esac

echo $user
# 拷贝文件到从机(这里注意主机的host需要根据你的实际情况配置,要与你具体的主机名对应)
for (( host=2;host<=5;host++ ))
do 
	echo "================current host is bigdata0$host================="
  # -p 保持文件原有权限
  # -g 保持文件原有用户组
  # -o 保持文件原有属主
  rsync -rvlpgo $pdir/$filename $user@bigdata0$host:$pdir
done

echo "complate !"
复制代码
#!/bin/bash

# 显示帮助信息
show_help() {
    echo "Usage: $0 [-i <host1> <host2> ... | -f <file> | -h] <command>"
    echo "  -i <host1> <host2> ...   Specify a list of hosts to execute the command on."
    echo "  -f <file>               Specify a file containing a list of hosts, one per line."
    echo "  -h                      Show this help message."
    echo "  <command>                The command to execute on the remote hosts."
    echo ""
    echo "Examples:"
    echo "  $0 /path/file"
    echo "  $0 -i \"bigdata01 bigdata02\" /path/file"
    echo "  $0 -f hosts.txt /path/file"
}

# 默认主机列表
default_hosts=("bigdata01" "bigdata02" "bigdata03" "bigdata04" "bigdata05")

# 读取主机列表,如果没有指定 -i 或 -f,则使用默认值
hosts=("${default_hosts[@]}")

# 解析参数
while getopts "f:i:h" opt; do
    case $opt in
        f)
            # 如果提供了 -f 参数,则读取文件中的主机列表
            hosts_file="$OPTARG"
            if [ ! -f "$hosts_file" ]; then
                echo "Error: File not found - $hosts_file"
                exit 1
            fi
            mapfile -t hosts < "$hosts_file"
            ;;
        i)
            # 如果提供了 -i 参数,则将后面的参数作为主机列表
            hosts=()
            IFS=' ' read -ra hosts <<< "$OPTARG"
            ;;
        h)
            show_help
            exit 0
            ;;
        \?)
            echo "Invalid option: -$OPTARG" >&2
            exit 1
            ;;
        :)
            echo "Option -$OPTARG requires an argument." >&2
            exit 1
            ;;
    esac
done

# 移除解析过的参数,留下命令
shift $((OPTIND -1))
if [ $# -eq 0 ]; then
    echo "No command provided."
    show_help
    exit 1
fi

# 获取传输文件名
p1=$1
filename=`basename $p1`
echo "load file $p1 success !"

# 获取文件的绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo "file path is $pdir"

# 获取当前用户(如果想使用root用户权限拷贝文件,在命令后加入-root参数即可)
user=$(whoami)
echo "User: $user"

# 拷贝文件到从机(这里注意主机的host需要根据你的实际情况配置,要与你具体的主机名对应)
for host in "${hosts[@]}";
do 
  # 拷贝文件到从机,跳过当前主机
  if [ "$host" == "$(hostname)" ] || [ "$host" == "$(hostname -I | awk '{print $1}')" ];  then
        echo "Skipping current host: $(hostname)"
        continue
  fi
	echo "================current host is $host================="
  # SSH到目标主机并检查目录是否存在,如果不存在则创建
  ssh $user@$host "mkdir -p '$pdir'"
  # -p 保持文件原有权限
  # -g 保持文件原有用户组
  # -o 保持文件原有属主
  rsync -rvlpgo $pdir/$filename $user@$host:$pdir
done

echo "complate !"
相关推荐
雯宝12 分钟前
mnt_init 函数
linux
律宏阔6 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔6 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴6 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千7 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei377 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei377 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei377 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh7 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker
GeW7 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux