파일 수정시 rsync를 어떻게 트리거합니까?


18

내가 가진 폴더를 동기화 할 수 있습니다 rsync -avz /directory /target내가에서 파일을 변경 한 경우 지금은 그것을 할, /directory그래서 rsync자동으로 호출해야합니다.

Virtual Box를 사용하고 있으며 특히 Virtual Folder의 공유 폴더가 문서 루트로 사용되는 웹 페이지가있는 경우 Virtual Box의 공유 폴더가 느립니다. 와 rsync내가 공유 폴더에 내 로컬 파일 작업을 할 수 있어야하고, 문서 루트와 자동으로 동기화 할 것입니다.

누군가가 그렇게하는 방법에 대한 아이디어가 있기를 바랍니다. crontab매 x 분마다 실행되기 때문에 좋지 않을 것입니다. 그래서 아무것도하지 않으면 여전히 전화 rsync하지만 파일을 수정하면 호출 되지 않습니다.

친애하는

답변:


18

crontab은 좋지 않을 것입니다. 매 x 초 / 분마다 실행되므로 아무것도하지 않으면 여전히 rsync를 호출하지만 파일을 수정하면 안됩니다.

rsync변경된 파일 만 동기화합니다. 아무것도 변경되지 않으면 종료됩니다. 실제로 최소한의 오버 헤드입니다.

당신이 마음에 들지 않으면 다음을 사용할 수 있습니다 inotifywait.

while inotifywait -r /directory/*; do
    rsync -avz /directory /target
done

그것은 더 순식간에 당신이 저장할 때마다 일을 할 것 입니다.


1
음, 문제는 inotify가 공유 nfs 폴더를 확인할 수 없다는 것입니다. 내가 원하는 것을 확인하기 위해, 가상 상자가 방랑자로 설치되어 있고, 공유 폴더 "프로젝트"가 부팅시 마운트되어 있으며 모든 웹 서버 파일이 거기에 있으므로 호스트에서 수정할 수 있습니다. 가상 상자 공유 폴더가 말했듯이 시스템 (win7)은 너무 느리므로 해결책은 마운트 된 nfs 폴더를 다른 위치 (예 : / var / www)와 동기화 할 수는 있지만 일반적인 방법은 작동하지 않습니다. 파일 변경, icrontab, gues gamin 또는 fam은 도움이 될 것이지만 시작하거나 사용하는 방법을 모르겠습니다.
BlackScorp

@BlackScorp 현실적으로 당신은 cronning rsync와 동기화가 필요한 것을 결정하게합니다. 대답에서 이끌어 낸 것처럼, 그것은 끔찍한 나쁜 선택이 아닙니다.
Oli

1
다른 옵션은 변경 사항을 원격으로 감지하지 않고 호스트에서 파일을 푸시하는 것입니다.
Oli

글쎄, 내가 전에 사용한이 솔루션에는 2 가지 문제가 있습니다 .1) 파일을 편집하기 위해 매번 가상 상자에 매번 재구성해야했습니다. 즉, 가상이 실행 중이어야하고 빠른 편집이 더 이상 작동하지 않습니다 .2) 이유를 모르겠지만 IDE (Netbeans) 삼바의 프로젝트 스캔 프로세스 중 99 %의 CPU 사용률을 보여주고 가상 상자 내의 모든 것이 느리게 개발되는 동안 웹 서버에서 rsyn + cronjob 솔루션 또는 php 빌드를 시도합니다
BlackScorp

inotifywait솔루션에는 약간의 중요한 단점 rsync이 있습니다. 실행 중 발생한 변경 사항을 감지하지 못합니다 . 다음 상황을 고려하십시오. 파일 A가 변경되었습니다. rsync가 트리거됩니다. rsync가 거의 완료 되면 파일 A를 동기화하면 파일 B가 변경됩니다. 이제 rsync완료되어 inotifywait실행 중이지만 파일 B는 동기화 되지 않으며 다음 변경 때까지 동기화되지 않습니다. @Arigion이 제안한대로 사용lsyncd 하는 것을 고려하십시오 .
MarSoft

6

Lsyncd (Live Syncing Daemon)를 사용할 수 있습니다 .

Lsyncd는 로컬 디렉토리 트리 이벤트 모니터 인터페이스 (inotify 또는 fsevents)를 감시합니다. 몇 초 동안 이벤트를 집계 및 결합한 다음 하나 이상의 프로세스를 생성하여 변경 내용을 동기화합니다. 기본적으로 이것은 rsync입니다. 따라서 Lsyncd는 새로운 파일 시스템이나 블록 장치를 필요로하지 않고 비교적 쉽게 설치할 수 있으며 로컬 파일 시스템 성능을 저해하지 않는 경량 라이브 미러 솔루션입니다.

다음은 Ubuntu 16.04에 대한 자습서입니다 .


2

inotifywait및 을 사용할 수 있습니다 rsync. inotifywait이벤트가 modify,create,delete활성화 된 상태 이렇게하면 파일이 변경 될 때만 서버와 동기화되며, 그렇지 않으면 파일을 읽을 때마다 동기화됩니다 (편집기는 파일을 여러 번 읽고 변경 사항이 있는지 확인합니다). 따라서 말했다 :

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done

rsync가 실행되는 동안 발생한 변경 사항을 감지하지 못합니다. lsyncd@Arigion이 제안한대로 사용 하는 것을 고려하십시오 .
MarSoft

이것은 각 변경 후 모든 파일의 모든 이벤트를 다시 적용 할 것입니다. 그리고 적용 할 때 해당 기간에는 어떠한 변화도 보이지 않습니다 ...
누군가

0

허용 된 답변에 대한 주석을 약간 확장하면 fswatch 를 사용 scp하여 게스트에게 변경된 파일을 트리거하는 데 성공 했습니다. 리눅스에서 이것은 랩퍼 inotify이지만 크로스 플랫폼이기도합니다 (저는 Arm 기반 QEMU 게스트가있는 Mac에 있습니다). 나는 ssh원격 빌드에도 착수했다 . 푸시 방식은 이상적인 방식보다 덜 작동하는 주식에 적합합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.