linux集群自动化脚本和增量复制

本文介绍了一种在Linux集群环境中使用自动化脚本的方法,包括xcall.sh和xsync.sh两个脚本,分别用于在集群上执行命令和进行增量文件复制。文章详细解释了脚本的代码和使用方法,强调了在复杂环境下的实用性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux集群shell自动化脚本和集群增量增量复制

在集群环境中,自动化脚本是不可缺少的,人力执行不但繁杂,而且更容易出错。

在老师的指导下编写了集群相关的xcall.sh和xsync.sh两个脚本,根据linux知识,我在原有基础上增加了返回值,使得脚本支持命令表操作。

第一个脚本接受一行命令作为参数,脚本可以自动ssh登陆到集群的每台服务器执行该命令。注:作为参数的命令可以不需要使用””(双引号)括起来,在一般的ssh登陆执行命令时如果有多行命令是需要括起来当作字符串一起传进ssh命令的。我的集群中配置了ssh免密登陆,如果有需要在脚本中给ssh传密码的需求可以使用ssh -s命令.

xcall.sh代码:

#!/bin/bash
if(($#==0)); then
    echo "请输入参数"
    exit 1;
fi
for((host=201; host<204; host++)); do
    echo ---------------bigdata$host-------------------
    ssh bigdata$host $*
done
exit 0;

xcall.sh脚本解释:

1. $#获取参数个数;exit 1退出当前shell并返回1(shell中约定0为真,非0为假);
2. (())可以适配常规的c语法编程(猜测shell的编程规范统要求:除了基础的编程框架,代码都向命令命令靠拢,这种统一的范式需求和Scala语言为了统一函数字面量而舍弃一些另一些功能差不多),Shell判断结构更“原生”的命令是test和[](这两个是同一个命令),shell的if、while等控制结构之所以在很多语言编程者看来有些别扭,就是因为这些**控制结构是直接将该语句当作命令执行**了的,并**根据返回值判断是否通过该控制结构**,理解这个对理解shell的控制结构是很有帮助的;
3. ssh bigdata$host $*$*取得的变量值组合成字符串(例如:ssh bigdata201 ls)执行,所以这句命令也就是通用的ssh登陆执行命令语句,$*获取所有参数并当作字符串执行,所以传参给xcall.sh 脚本时可以不用“”将多条语句括起来;
4. 程序正常执行完成便返回0.
5. ssh 直接在执行命令,会重新创建一个该用户的shell环境,所以需要在ssh登陆的那个用户主目录的.bashrc添加一行export /etc/profile #意思是引导profile这个全局变量配置文件
或者自己导入相应的环境变量

xsync.sh代码:

#!/bin/bash
if(($#==0));then
echo "请输入参数"
exit 1;
fi

p1=$1
# 文件名
fname=`basename $p1`
# 文件目录
pdir=`cd -P $(dirname $p1); pwd`
# 用户名
user=`whoami`

for((host=201; host<204; host++)); do
    commond="$pdir/$fname $user@bigdata$host:$pdir"
    echo ---------------$host-----------------------
    rsync -rlt $commond
    echo "$commond is success!"
done
exit 0;

xsync.sh脚本解释:

1. ``(倒引号,一般位于键盘esc键下面),效果是直接执行``里面的命令并将执行结果当作变量值存在;
2. basename $p1获取第一个参数代表的文件名或目录名,shell的采取变量参数,作为形参,$0保存脚本名称,参数从$1开始;
3. `cd -P $(dirname $p1); pwd` dirname获取上级目录,$(命令)在脚本中执行系统命令并由运行结果作为值被获取,cd -P 如果是路径是连接,则以真实路径切换,;pwd 作为最后一个命令执行,运行结果被``固定为当前值传给pdir,即绝对路径;
4. whoami(who am i 我是谁)返回当前用户名;rsync -rlt rsync是一个增量文件复制工具,-r递归-t启动增量复制。

自定义脚本用法:

xcall ls # 在集群上面执行ls,并显示执行结果。
xcall jps # 在集群运行jps命令查看并显示Java进程。因为jps是Java携带的命令,所以需要.bashrc文件环境变量。
xcall /usr/bin/其它命令 # 如果是脚本的话可以直接用绝对路径调用命令执行,环境变量调用命令有可能调用到不应该应该调用的吧,这和搜索环境变量有关;但是如果管理员使用root权限真的调用到黑客使用普通用户创建的命令时,命令背后执行的是什么就可想而知了(比如黑客使用普通用户创建了一个su命令,并赋予了x权限,然后放到一个普通权限路径的环境变量里面,如果PATH环境变量的这个普通权限路径在系统权限路径前面被先搜索到然后执行了,那么root用户的密码就有可能被泄露出去)。所以执行绝对路径绝对不亏,尤其是在底层脚本里面,系统的可用性、安全性、扩展性很多时候就是体现在这些细节里面。
xsync ./ # 将当前路径的内容增量复制到集群所有的机器上面,注意集群用户需要有这条路径的相应权限。(特提两点:一个是注意rsync命令是根据上一次复制的时间来判断是否需要复制,如果存在集群文件不一样但是名字一样,增量备份有可能出错;二是集群ip的管理,这里的ip是直接写死在代码里面的,如果有需要可将ip做一个配置文件进行管理,这样更加符合shell命令的规范)
xsync /usr/bin # 这个路径就是需要root权限才可以创建文件

命令表用法:

命令表操作:
xcall ls && echo success || echo fault #如果xcall ls 执行成功则打印success否则打印fault
xsync ./ && echo success || echo fault #如果xsync ./ 执行成功则打印success否则打印fault
命令表语法优缺点:
优点:一行命令即可清晰知道命令执行是否成功。而不用查看复杂的打印信息。如果实现了exit命令自己编写的脚本也能适配shell控制结构(if、while等)的控制语句。
缺点:加大了命令的实现难度,需要命令支持严格支持exit 0返回命令执行正确exit 1(非零)命令执行不正确的规范。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值