Shell分发脚本

原理

在集群中,我们经常会有此需求:循环复制文件到所有节点的相同目录下,不用一个节点一个节点单独使用命令,提高效率。

核心思想

rsync上进行封装

rsync命令分析

特点

rsync远程同步工具

rsync主要用于备份和镜像。具有速度快、避免复制相同的内容和支持符号链接的优点。

rsync和scp区别

rsync:速度更快,只更新差异文件,第一次同步 = scp。

scp:复制所有的文件。

基本语法

rsync -av(选择参数) 要拷贝的文件路径 目的用户@主机:目的路径

-a 归档拷贝

-v 显示复制过程

-r 对子目录以递归模式处理

实现

需求

循环复制文件(这里只针对文件)到所有节点的相同目录下

命令:xsync 要同步的文件名称

这里就需要在脚本中添加集群中节点,还有一种做法是可以通过在命令中传需要该文件的节点来传文件,还可以通过传参来确定是复制文件还是复制目录等。

这里我们就做最简单的实现,在脚本中添加集群中节点。在后续的使用中如果有其他需求,再在此基础上做改进。

使用rsync 实现需求

  1. rsync -av /opt/module/ ranan@hadoop103:/opt/module

所以我们需要获得当前的路径,当前的用户名及需要传递的主机名

环境变量

期望脚本在任何路径都能使用

脚本放在声明了全局环境变量的路径下

可以通过 echo $PATH 查看声明了全局环境变量的路径

脚本实现

  1. #指定bash解析器
  2. #!/bin/bash
  3. #1. $# 获得参数个数
  4. # 判断参数是否小于1,-lt (less than)小于,至少需要传送的文件
  5. if [ $# -lt 1 ]
  6. then
  7. echo Not Enough Arguement!
  8. exit;
  9. fi
  10. #2. 遍历集群所有机器
  11. # 对102,103,104都进行分发
  12. for host in hadoop102 hadoop103 hadoop104
  13. do
  14. # $host使用host变量
  15. echo ==================== $host ====================
  16. #3. $@代表命令行中所有的参数,也就是需要传送的文件,可以是多个
  17. for file in $@
  18. do
  19. #4. 判断文件是否存在 -e 文件存在(existence)
  20. if [ -e $file ]
  21. then
  22. #5. 获取父目录,常用命令
  23. # dirname 获取指定路径所在的目录 ,如 dirname /home/xu 结果为 /home。
  24. # $返回该命令的结果
  25. # pwd -P:如果目录是链接时, 显示出实际路径,而非使用连接(link)路径。
  26. # $(command) 等价于 `command` shell扫描一遍命令行,发现了$(command)结构,便将$(command)中的command执行一次,得到其标准输出,
  27. pdir=$(cd -P $(dirname $file); pwd)
  28. #6. 获取当前文件的名称
  29. fname=$(basename $file)
  30. # 先创建目录,防止传文件时,路径不存在
  31. #ssh xxx.xxx.xxx.xxx "命令",远程执行命令
  32. #mkdir -p递归创建目录,即使上级目录不存在,会按目录层级自动创建目录
  33. # -p 目录已存在时不会报错
  34. ssh $host "mkdir -p $pdir"
  35. rsync -av $pdir/$fname $host:$pdir
  36. # 如果不存在
  37. else
  38. echo $file does not exists!
  39. fi
  40. done
  41. done

知识点

获得当前路径的目录dirname

  1. 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去掉。

示例:

  1. $ basename /tmp/test/file.txt
  2. file.txt
  3. $ basename /tmp/test/file.txt .txt
  4. file

shell远程执行命令

  1. ssh ranan@xxx.xxx.xxx.xxx "pwd; cat hello.txt" //远程执行两条命令,用户名ranan
  2. ssh xxx.xxx.xxx.xxx "命令"

mkdir目录存在不报错

mkdir 目录,目录存在 mkdir的命令就会报错。

mkdir -p 创建多级目录,如果目录存在也不会报错

Shell 分发脚本的更多相关文章

  1. shell分发文件脚本

    配置文件scp.conf ssh_hosts=("IP") #需要分发机器的所有IP ssh_ports=("22") ssh_users=("roo ...

  2. shell及脚本4——shell script

    一.格式 1.1 开头 必须以 "# !/bin/bash"  开头,告诉系统这是一个bash shell脚本.注意#与!中间有空格. 二.语法 2.1 数值运算 可以用decla ...

  3. 【Telnet】使用Telnet协议连接到远程Shell执行脚本

    介绍 本文介绍如何通过Telnet协议连接到远程Shell,执行脚本,并获取执行结果: 相关文章: <[Jsch]使用SSH协议连接到远程Shell执行脚本>http://www.cnbl ...

  4. shell自动计算脚本

    shell自动计算脚本 #!/bin/bash echo $(($)) [root@bogon ~]# sh b.sh 123+123246 let用户声明这个操作是要计算,后者的效率更高 (expr ...

  5. Shell菜单脚本

    今天在这儿给大家分享一个我简单编写的Shell菜单脚本,傻瓜式的人机交互,人人都可以操作linux. #!/bin/sh #Shell菜单演示 function menu () { cat <& ...

  6. shell常见脚本30例

    shell常见脚本30例 author:headsen chen  2017-10-19  10:12:12 本文原素材出自网上,特此申明.有些地方加入我自己的改动 常见的30例shell脚本 1.用 ...

  7. shell常用脚本

    shell常用脚本 author:headsen chen  2017-10-17 15:36:17 个人原创,转载请注明,否则依法追究法律责任 1,vim  name.grep.sh 2,cat   ...

  8. 一篇关于Maven项目的jar包Shell启动脚本

    使用Maven作为项目jar包依赖的管理,常常会遇到命令行启动,笔者也是哥菜鸟,在做微服务,以及服务器端开发的过程中,常常会遇到项目的启动需要使用main方法,笔者潜心的研究了很多博客,发现大多写的都 ...

  9. Linux shell编写脚本部署pxe网络装机

    Linux shell编写脚本部署pxe网络装机 人工安装配置,Linux PXE无人值守网络装机  https://www.cnblogs.com/yuzly/p/10582254.html 脚本实 ...

随机推荐

  1. AGC036 A-Triangle | 构造

    题目链接 题意: 给出一个数$S(1\leqslant S \leqslant 10^{18})$. 要求在平面直角坐标系中找到三个点$(X_1,Y_1),(X_2,Y_2),(X_3,Y_3)$,满 ...

  2. Manacher算法 求 最长回文子串

    1 概述(扯淡) 在了解Manacher算法之前,我们得先知道什么是回文串和子串. 回文串,就是正着看反着看都一样的字符串.比如说"abba"就是一个回文串,"abbc& ...

  3. iscsi基本命令

    磁阵操作命令 根据磁阵端配置的业务地址(targetIP)和端口(3260),命令iscsiadm -m discovery -t sendtargets -p targetIP:port(3260) ...

  4. linux网络编程 IO多路复用 select epoll

    本文以我的小型聊天室为例,对于服务器端的代码,做了三次改进,我将分别介绍阻塞式IO,select,epoll . 一:阻塞式IO 对于聊天室这种程序,我们最容易想到的是在服务器端accept之后,然后 ...

  5. Python 数据类型常用的内置方法(一)

    目录 Python 数据类型常用的内置方法 1.整型 int 2.浮点型 float 字符串转浮点型: 3.字符串 str 多种类型转字符型: 索引 切片 len( )方法:统计字符串长度/个数 移除 ...

  6. Python多版本共存的方法

    目录 Python2.Python3共存的方法 python2下载及环境变量配置 第一步.打开Python官网,下载Python2 第二步.python2环境变量配置 测试结果 Python2.Pyt ...

  7. 力扣 - 剑指 Offer 22. 链表中倒数第k个节点

    题目 剑指 Offer 22. 链表中倒数第k个节点 思路1(栈) 既然要倒数第k个节点,那我们直接把所有节点放到栈(先进后出)里面,然后pop弹出k个元素就可以了 代码 class Solution ...

  8. github文件下载加速器

    https://d.serctl.com/?dl_start

  9. nodejs中的fs模块中的方法

    nodejs中的fs模块 引入模块 const fs =require("fs") 检测文件是否存在fs.stat(path,callback) fs.stat("./n ...

  10. CF1288

    A 考虑\(x + 1 = \sqrt{d}\)时在有理域上有最优界. 那我在整数域上附近取三个点取min就行了. // code by fhq_treap #include<bits/stdc ...