web-dev-qa-db-ja.com

rsyncが成功したかどうかを確認する

Rsyncが成功したかどうかを確認し、成功しなかった場合はエラーを収集する可能性はありますか?

--link-destを使用しているので、これを検出するのは難しいかもしれません。

私はbashにかなり慣れていないので、どんなガイダンスもいただければ幸いです。

これは、私のスクリプトのスリムバージョンです。

#!/bin/bash

set -e

site_Host=(
    "[email protected]"
    "[email protected]"  
)

backup_dest=(
    "/Users/computername/Desktop/rsync/test1.co.uk"
    "/Users/computername/Desktop/rsync/test2.co.uk"
)

now=`date "+%d/%m/%Y %H:%M:%S"`
today=`date +"%d-%m-%Y"`
yesterday=`date -v -1d +"%d-%m-%Y"`

log="/Users/computername/Desktop/rsync/rsync.log"

site_count=${#site_Host[@]}

for (( i = 0; i < site_count; i++ )); do

    site_source="${site_Host[$i]}:~/public_html"
    site_dest="${backup_dest[$i]}/$today/"

    rsync -zavx -e 'ssh -p22' \
            --numeric-ids \
            --delete -r \
            --link-dest=../$yesterday $site_source $site_dest

    echo "$now - File Backup Completed - ${backup_dest[$i]}/$today" >> $log 

done

更新しました:

#!/bin/bash

set -e

site_Host=(
    "[email protected]"
    "[email protected]"  
)

backup_dest=(
    "/Users/computername/Desktop/rsync/test1.co.uk"
    "/Users/computername/Desktop/rsync/test2.co.uk"
)

now=`date "+%d/%m/%Y %H:%M:%S"`
today=`date +"%d-%m-%Y"`
yesterday=`date -v -1d +"%d-%m-%Y"`

log="/Users/computername/Desktop/rsync/rsync.log"

site_count=${#site_Host[@]}

for (( i = 0; i < site_count; i++ )); do

    site_source="${site_Host[$i]}:~/public_html"
    site_dest="${backup_dest[$i]}/$today/"

    failures=0

    if  rsync -zavx -e 'ssh -p22' \
            --numeric-ids \
            --delete -r \
            --link-dest=../$yesterday $site_source $site_dest;
    then

        echo "$now - File Backup Completed - ${backup_dest[$i]}/$today" >> $log 

    else

        echo "$now - File Backup Failed - ${backup_dest[$i]}/$today" >> $log 
        failures=$((failures+1))

    fi

    if ((failures != 0)); then exit 1; fi 

done
2
ccdavies

ほとんどのプログラムと同様に、rsyncはエラーが発生した場合にゼロ以外のステータスを返します。スクリプトの先頭にset -eがあるため、rsyncが存在する場合、スクリプトはゼロ以外のステータスで終了します。

Rsyncが失敗した場合に回復を行いたい場合は、続行してステータスを分析できます。 set -eでは、スクリプトが終了しないように、rsyncコマンドを条件付きで配置する必要があります。

failures=0
…
  if rsync …; then
    echo "rsync succeeded"
  else
    echo "rsync failed"
    failures=$((failures+1))
  fi
…
if ((failures != 0)); then exit 1; fi

ステータスコードを分析する場合、一般的なイディオムはstatus=0; rsync … || status=$?です。||演算子の右側のコマンドは常に成功するため、このコマンドは常に成功ステータスを返し、statusはrsyncコマンドのステータスに設定されます。

  status=0
  rsync … || status=$?
  if ((status != 0)); then
    …
  fi