rsync를 사용하여 스크립트를 개선하는 방법

rsync를 사용하여 스크립트를 개선하는 방법

rsync파일을 백업하고 동기화하기 위한 다음 스크립트가 있습니다 .

이 스크립트를 더 컴팩트하고 빠르게 만들고 오류 처리 기능을 향상시키려면 어떻게 해야 합니까?

#!/bin/sh
  
errors=""

sudo rsync -avh --delete --no-o --no-g /home/xralf/audio /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
  echo "no errors in audio"
else
  errors="${errors}error in audio\n"
fi

sudo rsync -avh --delete --no-o --no-g /home/xralf/books /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
  echo "no errors in books"
else
  errors="${errors}error in books\n"
fi

sudo rsync -avh --delete --no-o --no-g /home/xralf/source_code /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
  echo "no errors in source_code"
else
  errors="${errors}error in source_code\n"
fi

# more such directories with this code pattern

echo ${errors}

나중에는 스크립트가 실행되는 것을 보지 않을 계획이었기 때문에 단지 결과를 보고 모든 것이 잘 되었다고 믿고 싶었습니다. 스크립트를 실행했지만 결국 내가 가진 유일한 정보는 error in source_code정확히 오류가 무엇인지(어떤 파일이 오류를 일으켰는지) 알 수 없다는 것뿐이었습니다.

답변1

당신의 우선순위가포켓그리고빠르게(예: 프로세스 수를 최소화합니다. 하지만 이 경우 CPU나 메모리가 아닌 디스크 IO로 제한됩니다.)

#!/bin/bash
sudo rsync -a --delete --no-o --no-g \
       /home/xralf/{audio,books,source_code} \
       /media/extdevice/rsync_backups/ &&
    echo "rsync completed successfully" 1>&2 || echo "rsync ended with errors" 1>&2

-v옵션을 제거하면 출력의 노이즈가 줄어들어 명시적 오류(있는 경우)에 집중할 수 있습니다. 1>&2오류 메시지가 예상 위치로 전송되도록 STDOUT을 STDERR로 리디렉션합니다 . 무인으로 실행하는 경우 다음 대안이 내장된 것보다 더 나은 선택일 수 있지만 echo추가 프로세스가 필요합니다.

  1. logger서버를 사용하여 중앙 집중식 처리 에 메시지를 보낼 수 있습니다 syslog. 정확한 구문은 서버 구성에 따라 다릅니다.

  2. 타이밍 정보를 추가하기 위해 date스크립트의 마지막 줄은 다음과 같습니다.

date +"[%Y/%m/%d %H:%M:%S] rsync completed successfully" 1>&2 || \
date +"[%Y/%m/%d %H:%M:%S] rsync ended with errors" 1>&2

다음과 같은 것을 출력하십시오.[2022/12/05 14:37:27] rsync completed successfully

답변2

강제되지는 않지만 sh더 복잡한 셸(예: )을 사용할 수 있는 경우 bash다음을 수행할 수 있습니다.

#!/bin/bash

dirs=( "audio" "books" "source_code" );
errors=()
for dir in "${dirs[@]}"; do
  sudo rsync \
       -avh --delete --no-o --no-g \
       /home/xralf/"$dir" \
       /media/extdevice/rsync_backups/ &&
    echo "no errors in $dir" ||
      errors+=("error in $dir\n")
done

printf '%s\n' "${errors[@]}"

stderr을 캡처하고 싶을 수도 있지만 이는 스크립트와 동일한 작업을 수행합니다.

답변3

rsync명령은 매개변수를 허용합니다 --log-file=FILE. 백업이 완료되면 오류를 확인할 수 있습니다.

--exclude-from=FILE효율성을 위해 및 도 허용됩니다 --include-from=FILE. 모든 항목의 목록을 포함하는 텍스트 파일을 만들 수 있습니다.하다그리고원하지 않는다rsync여러 명령이 아닌 단일 명령을 통해 백업하고 호출하고 싶습니다 .

를 참고 man rsync하시거나온라인 매뉴얼 페이지.

답변4

라는 파일을 만드세요.module.sh그리고 다음 텍스트를 제공하세요.

#!/usr/bin/env bash                                                                                                                     

# -A=Archive. Use recursion and preserve almost everything.
# -V=Verbose.
# -H=Preserve hard links.
# -Z=Compress.
# --Delete=
#     If node in directory 'from' gets deleted,
#     delete it in directory 'to'.
# --No-o=No Owner. 
# --No-g=No Group.
# The --No's are partially undoing the Archive option.

sync_dir(){
    local from="${1}";
    local to="${2}";

    rsync               \
        -avhz           \
        --delete        \
        --no-o          \
        --no-g          \
            "${from}/"  \
            "${to}"     \
        1>/dev/null     \
        ;

    # Store the sync success.
    local sync_result="${?}";

    # The project name is the last directory of the from string.
    local project_name=$(grep -oE '[^/]*$' <<<"${from}");

    local error="No error in: ${project_name}";
    if [ "${sync_result}" -ne "0" ]; then
        error="Error in: ${project_name}\n";
        fi  
    printf "${error}\n";
    };

그런 다음 다른 파일을 만들고 거기에서 모듈을 가져옵니다.

#!/usr/bin/env bash
                                                                       
. ./module.sh;

sync_dir '/home/xralf/audio' '/media/extdevice/rsync_backups/';
# More sync dirs here.

다른 Shebang에 주목하세요. 이것은 POSIX와 호환됩니다.

또한 Rsync에 -z 옵션을 추가했습니다. 도중에 데이터를 압축합니다.

관련 정보