一、 rsync 遠程同步工具
rsync主要用於備份和鏡像。具有速度快、避免復制相同內容和支持符號鏈接的優點。
rsync和scp區別:用rsync做文件的復制要比scp的速度快,rsync只對差異文件做更新。scp是把所有文件都復制過去。
(1)基本語法
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 選項參數 要拷貝的文件路徑/名稱 目的用戶@主機:目的路徑/名稱
選項參數說明:
-r 遞歸
-v 顯示復制過程
-l 拷貝符號連接
(2)案例實操
在HP111機器上的/root/input目錄下新建demo2.txt然后同步到HP113服務器的/root/input
[root@HP111 ~]# rsync -rvl input/ root@HP113:/root/input/
sending incremental file list
created directory /root/input
./
demo1.txt
demo2.txt
sent 234 bytes received 91 bytes 650.00 bytes/sec
total size is 60 speedup is 0.18
然后在HP113查看
二、編寫集群分發腳本xsync
(1)需求:循環復制文件到所有節點的相同目錄下
(2)需求分析:
(a)rsync命令原始拷貝:
rsync -rvl /root/software root@HP110:/root/software
(b)期望腳本:
xsync 要同步的文件名稱
(c)在/usr/local/bin這個目錄下存放的腳本,可以在系統任何地方直接執行。
(3)腳本實現
(a)在/root目錄下創建bin目錄,並在bin目錄下xsync創建文件,文件內容如下:
[root@HP111 ~]# mkdir bin [root@HP111 ~]# cd bin/ [root@HP111 bin]# touch xsync [root@HP111 bin]# vi xsync
在該文件中編寫如下代碼:
#!/bin/bash #1 獲取輸入參數個數,如果沒有參數,直接退出 pcount=$# if((pcount==0)); then echo no args; exit; fi
#2 獲取文件名稱
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 獲取上級目錄到絕對路徑
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 獲取當前用戶名稱
user=`whoami`
#5 循環
for((host=111; host<=113; host++)); do
echo ------------------- HP$host --------------
rsync -rvl $pdir/$fname $user@HP$host:$pdir
done
(b)修改腳本xsync所有用戶具有執行權限
(c)調用腳本形式:xsync 文件名稱
[root@HP113 bin]# xsync /root/bin
注意:如果將xsync放到/root/bin目錄下仍然不能實現全局使用,可以將xsync移動到/usr/local/bin目錄下。
(4)調用腳本形式: xcall 操作命令
[root@HP111 ~]# xsync /root/bin fname=bin pdir=/root ------------------- HP111 -------------- sending incremental file list sent 74 bytes received 17 bytes 60.67 bytes/sec total size is 532 speedup is 5.85 ------------------- HP112 -------------- sending incremental file list bin/ bin/xsync sent 652 bytes received 39 bytes 1,382.00 bytes/sec total size is 532 speedup is 0.77 ------------------- HP113 -------------- sending incremental file list bin/ bin/xsync sent 652 bytes received 39 bytes 1,382.00 bytes/sec total size is 532 speedup is 0.77
/usr/bin下面的都是系統預裝的可執行程序,會隨着系統升級而改變。
/usr/local/bin目錄是給用戶放置自己的可執行程序的地方,推薦放在這里,不會被系統升級而覆蓋同名文件。如果兩個目錄下有相同的可執行程序,這里/usr/local/bin優先於/usr/bin。
三、編寫分發腳本xcall
(1)需求分析:在所有主機上同時執行相同的命令
xcall +命令
(2)在/root/bin目錄下創建xcall文件,文件內容如下:
#!/bin/bash pcount=$# if((pcount==0));then echo no args; exit; fi echo -------------start---------- $@ for((host=111; host<=113; host++)); do echo ----------HP$host--------- ssh HP$host $@ done
(3)修改腳本 xcall 所有用戶具有執行權限
[root@HP113 bin]# chmod a+x xcall
(4)調用腳本形式: xcall 操作命令
[root@HP111~]# xcall rm -rf /root/input/demo2.txt [root@HP111 bin]# xcall rm /root/input/demo2.txt -------------localhost---------- ----------HP111--------- ----------HP112--------- ----------HP113---------
四、xsync和xcall腳本命令的理解
這是我自己對xsync和xcall腳本的理解,自己查閱資料總結的,自己以前對shell也不是好,特此記錄便於自己理解
#獲取輸入參數個數,如果沒有參數,直接退出 pcount=$# $#表示所有參數的個數 if((pcount==0)); then echo no args; exit; fi 選擇語句格式 if(判斷條件) then 執行語句 fi 結束標志 獲取文件名稱 p1=$1 fname=`basename $p1` echo fname=$fname basename: [root@HP111 ~]# basename /root/input/demo1.txt demo1.txt 為basename指定一個路徑,basename命令會將路徑信息去除,只留下文件名 p1=$1 fname=`basename $p1` :將xsync命令后面的第一個參數進行basename命令取得文件並復制給fname 獲取上級目錄到絕對路徑 pdir=`cd -P $(dirname $p1); pwd` echo pdir=$pdir dirname 用於取指定路徑所在的目錄 ,如 dirname /root/input/demo1.txt 結果為 /root/input cd 是去到/root/input pwd 是取/root/input目錄的絕對路徑 獲取當前用戶名稱 user=`whoami` whoami是Linux操作系統中用於查看當前有效用戶名的命令 循環 for((host=111; host<=113; host++)); do #echo $pdir/$fname $user@hadoop$host:$pdir echo --------------- hadoop$host ---------------- rsync -rvl $pdir/$fname $user@hadoop$host:$pdir done 循環語句格式: for(循環條件)do 執行語句 done $@ 引用所有參數(命令) for((host=111; host<=113; host++)); do echo ----------hadoop$host--------- ssh hadoop$host $@ #循環執行引用所有參數(命令) done
$* 與 $@ 區別:
相同點:都是引用所有參數。
不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數 1、2、3,,則 " * " 等價於 "1 2 3"(傳遞了一個參數),而 "@" 等價於 "1" "2" "3"(傳遞了三個參數)。
注意:查看腳本循環條件的主機名是否適合
如:host=111; host<=113; host++循環的主機是不是全部包括集群主機