Shell 分发脚本
2021/11/23 7:12:50
本文主要是介绍Shell 分发脚本,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- Shell分发脚本
- 原理
- rsync命令分析
- 特点
- 基本语法
- rsync命令分析
- 实现
- 需求
- 环境变量
- 脚本实现
- 知识点
- 获得当前路径的目录dirname
- 获得当前路径的文件名basename
- shell远程执行命令
- mkdir目录存在不报错
- 原理
Shell分发脚本
原理
在集群中,我们经常会有此需求:循环复制文件到所有节点的相同目录下,不用一个节点一个节点单独使用命令,提高效率。
核心思想
rsync上进行封装
rsync命令分析
特点
rsync远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同的内容和支持符号链接的优点。
rsync和scp区别
rsync:速度更快,只更新差异文件,第一次同步 = scp。
scp:复制所有的文件。
基本语法
rsync -av(选择参数) 要拷贝的文件路径 目的用户@主机:目的路径
-a 归档拷贝
-v 显示复制过程
-r 对子目录以递归模式处理
实现
需求
循环复制文件(这里只针对文件)到所有节点的相同目录下
命令:xsync 要同步的文件名称
这里就需要在脚本中添加集群中节点,还有一种做法是可以通过在命令中传需要该文件的节点来传文件,还可以通过传参来确定是复制文件还是复制目录等。
这里我们就做最简单的实现,在脚本中添加集群中节点。在后续的使用中如果有其他需求,再在此基础上做改进。
使用rsync 实现需求
rsync -av /opt/module/ ranan@hadoop103:/opt/module
所以我们需要获得当前的路径,当前的用户名及需要传递的主机名
环境变量
期望脚本在任何路径都能使用
脚本放在声明了全局环境变量的路径下
可以通过 echo $PATH 查看声明了全局环境变量的路径
脚本实现
#指定bash解析器 #!/bin/bash #1. $# 获得参数个数 # 判断参数是否小于1,-lt (less than)小于,至少需要传送的文件 if [ $# -lt 1 ] then echo Not Enough Arguement! exit; fi #2. 遍历集群所有机器 # 对102,103,104都进行分发 for host in hadoop102 hadoop103 hadoop104 do # $host使用host变量 echo ==================== $host ==================== #3. $@代表命令行中所有的参数,也就是需要传送的文件,可以是多个 for file in $@ do #4. 判断文件是否存在 -e 文件存在(existence) if [ -e $file ] then #5. 获取父目录,常用命令 # dirname 获取指定路径所在的目录 ,如 dirname /home/xu 结果为 /home。 # $返回该命令的结果 # pwd -P:如果目录是链接时, 显示出实际路径,而非使用连接(link)路径。 # $(command) 等价于 `command` shell扫描一遍命令行,发现了$(command)结构,便将$(command)中的command执行一次,得到其标准输出, pdir=$(cd -P $(dirname $file); pwd) #6. 获取当前文件的名称 fname=$(basename $file) # 先创建目录,防止传文件时,路径不存在 #ssh xxx.xxx.xxx.xxx "命令",远程执行命令 #mkdir -p递归创建目录,即使上级目录不存在,会按目录层级自动创建目录 # -p 目录已存在时不会报错 ssh $host "mkdir -p $pdir" rsync -av $pdir/$fname $host:$pdir # 如果不存在 else echo $file does not exists! fi done done
知识点
获得当前路径的目录dirname
pdir=$(cd -P $(dirname $file); pwd)
$file 获取当前路径所在的目录 ,如 dirname /home/xu 结果为 /home。
$ 返回该命令的结果
pwd -P:如果目录是链接时,显示出实际路径,而非使用连接(link)路径。
cd -P:如果目录是链接时,切换到实际路径的目录。
获得当前路径的文件名basename
basename命令格式:
basename [pathname] [suffix]
basename [string] [suffix]
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
示例:
$ basename /tmp/test/file.txt file.txt $ basename /tmp/test/file.txt .txt file
shell远程执行命令
ssh ranan@xxx.xxx.xxx.xxx "pwd; cat hello.txt" //远程执行两条命令,用户名ranan ssh xxx.xxx.xxx.xxx "命令"
mkdir目录存在不报错
mkdir 目录,目录存在 mkdir的命令就会报错。
mkdir -p 创建多级目录,如果目录存在也不会报错。
这篇关于Shell 分发脚本的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南