Bash

多台伺服器的rsync備份腳本

  • October 12, 2015

我有一個簡單的腳本,可以使用 rsync 通過 ssh 從遠端伺服器備份數據。

我有外部配置文件。在這個配置文件中,我有變數:OPTIONS、REMOTE_IP、SOURCE 和 DESTINATION。

現在我需要添加更多遠端伺服器並開始為多個伺服器使用單個腳本。我想用部分來定義它(比如

$$ SERVER_01 $$,$$ SERVER_02 $$…)在配置中。 腳本:

# You can provide external configuration file if you specify it with -c option
# Then if you haven't specified it, use one from ~/rsync_script/config.cfg

if [[ $1 == -c ]]; then
   CONFIG_FILE=$2
else
   CONFIG_FILE=~/rsync_script/config.cfg
fi


# Add constants from config file to script's environment

if [[ -f $CONFIG_FILE ]]; then
   . $CONFIG_FILE
fi


# Create full path before running rsync, because rsync cannot mkdir with -p option
# Run rsync with parameters from config.cfg and put files to $DESTINATION/$REMOTE_IP/YYYY-MM-DD

if [[ -d $DESTINATION ]]; then
   mkdir -p $DESTINATION$REMOTE_IP/$(date +"%A")
   rsync -avx \
       --timeout=30 \
       $OPTIONS \
       rsync@$REMOTE_IP:$SOURCE $DESTINATION$REMOTE_IP/$(date +"%F")
else
       echo "failure"
fi

配置:

# Set extra options for rsync command
OPTIONS="--itemize-changes --log-file=changes.log"
# Set IP address of server the you want to backup
REMOTE_IP="192.168.11.123"
# Set the folder on remote server to backup
SOURCE="/home/rsync/somedata"
# Set the destination folder on local machine
DESTINATION="/backup/"

請建議我解決此問題的最佳方法

歡迎任何程式碼評論和建議:)

謝謝

這是一個可能的情況。將您現有的 rsync 程式碼 ( if [[ -d $DESTINATION ...) 放入一個 shell 函式中,例如runbackup,並. $CONFIG_FILE用一個循環替換執行的部分,該循環讀取文件並查找[SERVER_...]節分隔符。當它找到一個時,它會呼叫 runbackup 函式(第一個除外)。對於其他行,它eval在每一行上所做的就像.做的那樣。為了確保在最後一個部分呼叫 runbackup,[END]在輸入中添加了一個虛擬部分。

(cat $CONFIG_FILE; echo '[END]') |
while read line
do if [[ "$line" =~ ^\[([A-Z_0-9]+)\] ]]
  then if [ -n "$OPTIONS" -a -n "$REMOTE_IP" ]
       then echo "section $section"
            runbackup
       fi
       section=${BASH_REMATCH[1]} # captured from =~ regex above
       unset OPTIONS REMOTE_IP SOURCE DESTINATION
  else eval $line
  fi
done 

引用自:https://unix.stackexchange.com/questions/231347