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
답변1
대부분의 프로그램과 마찬가지로 rsync는 오류가 발생하면 0이 아닌 상태를 반환합니다. set -e
스크립트의 맨 위에 있으므로 rsync가 종료되면 스크립트는 0이 아닌 상태로 종료됩니다.
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