GVFS를 통한 FTP 동기화

GVFS를 통한 FTP 동기화

FTP 서버에서 PHP 파일을 편집해야 하는데, GVFS 마운트에 저장할 때 로컬 편집기를 신뢰할 수 없기 때문에 rsync동기화하도록 두었습니다.

#!/bin/bash
webroot=/run/user/1002/gvfs/ftp\:host\=ftp.server.com/
while true
do
    inotifywait -r -e create -e modify -e close_write -e moved_to ./ | \
    mawk '{ print $1 }' | \
    while read f
    do
        # currently, $f is always a directory (not just the changed file)
        echo "rsync $f..."
        mkdir -p $webroot"$f"
        rsync --exclude "*/" -rlpgoD "$f" $webroot"$f"
    done
done

이 스크립트는 변경된 파일의 디렉터리를 동기화하지만 속도가 매우 느립니다. 그래서 나는 개선하려고 노력하고 있습니다.

이런 스크립트를 어떻게 작성하시겠어요? 이상적으로는 전체 디렉터리를 동기화하지 않고 변경된 파일만 동기화합니다.

답변1

공간이 있으면 원격 계층의 로컬 복사본을 보관할 수 있습니다. 실제 계층 구조의 변경으로 인해 inotify가 실행되면 rsync -a -i실제 복사본과 로컬 복사본 사이를 사용하여 이를 업데이트하고 실제 변경 사항 목록을 생성할 수 있습니다. 이 목록은 로컬 복사본에서 원격 업데이트를 재동기화하는 데에만 사용해야 합니다.

이 상황을 해결하려면 rsync 매뉴얼 페이지를 참조하세요.배치 모드부분. 실제 복사본과 로컬 복사본 사이에서 수행하는 -i작업 대신 원격으로 수행하여 정확히 동일한 변경 사항을 적용하십시오. (foo 파일은 모든 변경 사항의 복사본을 포함하는 바이너리 파일입니다.)rsync -a --write-batch=foorsync -a --read-batch=foo


다음은 /tmp에서 a, b, c 디렉터리를 사용하는 예입니다. 여기서 a는 파일이 편집되는 실제 디렉터리이고, b는 원격 장치의 로컬 캐시 복사본이며, c는 원격 디렉터리입니다. 먼저 a를 생성하고 이를 b와 c에 복사합니다. 나중에 변경할 수 있도록 c를 변수에 넣었습니다.

cd /tmp || exit
echo do: rm -fr a b c foo foo.sh
c=c
mkdir a
echo hi >a/f1
echo hi >a/f2
rsync -av a/ b
rsync -av a/ "$c"

3개의 동일한 디렉토리가 있습니다. 디렉토리 a를 편집합니다.

echo bye >>a/f1
echo bye >>a/f3
rm -f a/f2

a를 b와 동기화하고 배치 파일 foo를 만듭니다.

rsync -av --delete --write-batch=/tmp/foo a/ b

이제 c의 foo에 저장된 변경 사항을 다시 실행할 수 있습니다.

rsync -av --delete --read-batch=/tmp/foo  "$c"

이제 동일한 디렉터리가 3개 더 나타납니다. 장점은 rsync가 foo 파일에 기록된 업데이트만 수행한다는 것입니다. c용 로컬 ftp gvfs 마운트를 사용하여 이 작업을 시도했지만 작동하지 않았습니다( c="$XDG_RUNTIME_DIR/gvfs/ftp:host=localhost,user=ftp/test/"). gvfsd-fuse 마운트는 매우 버그가 많은 것처럼 보이며 때로는 원격 파일이 디렉토리여야 한다고 가정하므로 rsync는 이를 절대 사용하지 않습니다.

관련 정보