Shell 分发脚本
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 分发脚本的更多相关文章
- shell分发文件脚本
配置文件scp.conf ssh_hosts=("IP") #需要分发机器的所有IP ssh_ports=("22") ssh_users=("roo ...
- shell及脚本4——shell script
一.格式 1.1 开头 必须以 "# !/bin/bash" 开头,告诉系统这是一个bash shell脚本.注意#与!中间有空格. 二.语法 2.1 数值运算 可以用decla ...
- 【Telnet】使用Telnet协议连接到远程Shell执行脚本
介绍 本文介绍如何通过Telnet协议连接到远程Shell,执行脚本,并获取执行结果: 相关文章: <[Jsch]使用SSH协议连接到远程Shell执行脚本>http://www.cnbl ...
- shell自动计算脚本
shell自动计算脚本 #!/bin/bash echo $(($)) [root@bogon ~]# sh b.sh 123+123246 let用户声明这个操作是要计算,后者的效率更高 (expr ...
- Shell菜单脚本
今天在这儿给大家分享一个我简单编写的Shell菜单脚本,傻瓜式的人机交互,人人都可以操作linux. #!/bin/sh #Shell菜单演示 function menu () { cat <& ...
- shell常见脚本30例
shell常见脚本30例 author:headsen chen 2017-10-19 10:12:12 本文原素材出自网上,特此申明.有些地方加入我自己的改动 常见的30例shell脚本 1.用 ...
- shell常用脚本
shell常用脚本 author:headsen chen 2017-10-17 15:36:17 个人原创,转载请注明,否则依法追究法律责任 1,vim name.grep.sh 2,cat ...
- 一篇关于Maven项目的jar包Shell启动脚本
使用Maven作为项目jar包依赖的管理,常常会遇到命令行启动,笔者也是哥菜鸟,在做微服务,以及服务器端开发的过程中,常常会遇到项目的启动需要使用main方法,笔者潜心的研究了很多博客,发现大多写的都 ...
- Linux shell编写脚本部署pxe网络装机
Linux shell编写脚本部署pxe网络装机 人工安装配置,Linux PXE无人值守网络装机 https://www.cnblogs.com/yuzly/p/10582254.html 脚本实 ...
随机推荐
- Java并发:AbstractQueuedSynchronizer(AQS)
队列同步器 AbstractQueuedSynchronizer 是一个公共抽象类.提供一个同步器框架,用于实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量,事件等).使用一个 in ...
- TCP/IP简述
一.TCP/IP简述 TCP/IP从字面异议看起来是指TCP和IP两种协议,实际上,它只是利用IP进行通信时必须用到的协议群的统称.具体的来说,IP或ICMP.TCP或UDP.Telnet或FTP.以 ...
- 看动画学算法之:双向队列dequeue
目录 简介 双向队列的实现 双向队列的数组实现 双向队列的动态数组实现 双向队列的链表实现 双向链表的时间复杂度 简介 dequeue指的是双向队列,可以分别从队列的头部插入和获取数据,也可以从队列的 ...
- gas-station leetcode C++
There are N gas stations along a circular route, where the amount of gas at station i isgas[i]. You ...
- 用C++实现的数独解题程序 SudokuSolver 2.7 及实例分析
引言:一个 bug 的发现 在 MobaXterm 上看到有内置的 Sudoku 游戏,于是拿 SudokuSolver 求解,随机出题,一上来是个 medium 级别的题: 073 000 060 ...
- 如何反编译微信小程序👻
如何反编译微信小程序 准备工具: 夜神模拟器(或者你可以自己准备一个安卓模拟器,有root权限.) RE文件管理器(下载地址:https://soft.ucbug.com/uploads/shouji ...
- 不破不立,祝贺EDG夺得S11冠军。这一夜,我看到太多Flag成真
在昨晚11月6号夜进行的2021英雄联盟S11总决赛中,中国战队EDG夺冠!全国各地高校的男生宿舍像过年一般庆祝夺冠,高呼:EDG世界冠军! 前三局1:2的劣势下,第四局十分胶着,最终EDG顽 ...
- python -m参数
把模块当做脚本运行,标准库和第三方库都可以 会把当前路径添加到sys.path中
- Effective C++ 总结笔记(六)
七.模板与泛型编程 41.了解隐式接口和编译器多态 1.类和模板都支持接口和多态. 2.类的接口是显式定义的--函数签名.多态是通过虚函数在运行期体现的. 3.模板的接口是隐式的(由模板函数的实现代码 ...
- [loj3340]命运
容斥,强制若干条链不重要,即有$2^{n-1-s}$种(其中$s$为这些链的并所覆盖的边数),暴力将选中的链打标记,时间复杂度$o(m^{2}2^{m}+n\log_{2}n)$(预处理出这$2m$个 ...