Linux编写xcall命令执行与xsync文件同步脚本

Linux编写xcall命令执行与xsync文件同步脚本

在多机集群环境中,运维人员经常需要对多台服务器执行相同操作或同步分发文件,这不仅繁琐而且容易出错。为了提升工作效率和操作一致性,本文介绍了两个实用的 Linux 脚本工具——xcall 和 xsync。xcall 脚本支持多主机并行执行指定命令,极大地方便了集群管理和批量任务执行;xsync 脚本则通过 rsync 实现了多台机器间的文件目录同步,确保环境配置和数据一致。本文详细说明了脚本的创建方法与使用示例,帮助大家轻松完成中间件集群安装与配置工作。

环境准备

  • 一台以上的centos服务器
  • 各个机器之间完成的ssh免密

关于如何ssh免密,推荐我的博文 # centos之间ssh免密

xsync

创建配置

  1. 集群中的机器都需要执行下面的命令,进行安装rsync

    1
    sudo yum install rsync -y
  2. 在需要的节点上执行下面的命令,以便创建xsync

    执行命令之前,注意修改for i in master node1 node2为自己的主机ip

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    sudo tee /usr/local/bin/xsync <<'EOF'
    #!/bin/bash

    # 获取输出参数,如果没有参数则直接返回
    pcount=$#
    if [ $pcount -eq 0 ]; then
    echo "No parameter found!";
    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=$2
    case "$user" in
    "-root")
    user="root"
    ;;
    "")
    user=$(whoami)
    ;;
    *)
    echo "Illegal parameter $user"
    exit 1
    ;;
    esac

    echo "Using user: $user"

    # 确保从机的目标目录存在
    for i in master node1 node2; do
    echo "================current host is $i================="
    ssh "$user@$i" "mkdir -p $pdir"
    rsync -av "$pdir/$filename" "$user@$i:$pdir"
    if [ $? -ne 0 ]; then
    echo "Rsync to $i failed!"
    exit 1
    fi
    done

    echo "Complete!"
    EOF
    sudo chmod +x /usr/local/bin/xsync

使用示例

one.txt分发到集群的其他机器的相同路径下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[admin@master tmp]$ xsync one.txt 
load file one.txt success !
file path is /home/admin/tmp
admin
================current host is master=================
sending incremental file list

sent 43 bytes received 12 bytes 110.00 bytes/sec
total size is 2 speedup is 0.04
================current host is node1=================
sending incremental file list
one.txt

sent 92 bytes received 35 bytes 254.00 bytes/sec
total size is 2 speedup is 0.02
================current host is node2=================
sending incremental file list
one.txt

sent 92 bytes received 35 bytes 84.67 bytes/sec
total size is 2 speedup is 0.02
complate !

xcall

创建配置

在需要的节点上执行下面命令即可完成创建配置xcall

执行命令之前,注意修改for i in master node1 node2为自己的主机ip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
sudo tee /usr/local/bin/xcall <<'EOF'
#!/bin/bash

# 获取控制台指令
cmd="$*"

# 判断指令是否为空
if [ -z "$cmd" ]; then
echo "command cannot be null!"
exit 1
fi

# 获取当前登录用户
user=$(whoami)

# 在从机执行指令,这里需要根据你具体的集群情况配置,host与具体主机名一致
for i in master node1 node2; do
echo "================current host is $i================="
echo "--> execute command "$cmd""

# 通过 SSH 执行命令
if ssh ${user}@${i} "source /etc/profile; $cmd"; then
echo "Command executed successfully on $i"
else
echo "Failed to execute command on $i"
exit 1
fi
done

echo "All commands executed successfully!"
EOF
sudo chmod +x /usr/local/bin/xcall

使用示例

使用 xcall 脚本查看集群中所有机器的java进程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[admin@master bin]$ xcall jps
================current host is master=================
--> execute command "jps"
25985 JobHistoryServer
24419 DataNode
26261 Jps
24219 NameNode
25292 ResourceManager
25437 NodeManager
24750 SecondaryNameNode
Command executed successfully on master
================current host is node1=================
--> execute command "jps"
3545 DataNode
3690 NodeManager
3948 Jps
Command executed successfully on node1
================current host is node2=================
--> execute command "jps"
3609 DataNode
3754 NodeManager
4013 Jps
Command executed successfully on node2
All commands executed successfully!

结语

通过 xcall 和 xsync 脚本的应用,运维人员能够显著简化多机环境下的重复操作与文件同步任务,降低人为操作风险,提升工作效率。这两个工具兼具易用性与实用性,适合各种中间件集群及多节点部署场景。希望本文分享的脚本和方法能为您的运维管理带来便利,推动集群运维自动化的进程。后续可根据实际需求进一步扩展脚本功能,实现更智能化的集群管理

作者

李博帅

发布于

2024-05-01

更新于

2025-04-20

许可协议