Linux : 한 방향으로 파일을 지속적으로 동기화


61

시나리오 : IDE는 Linux 데스크탑 상자에 설정되어 PHP 파일을 로컬로 편집합니다. 파일을 저장할 때마다이 변경 사항이 Apache가 실행중인 Linux 서버에 나타나기를 원합니다. 서버에는 ssh (및 그 문제에 대한 samba 및 nfs)가 있습니다.

참고로, Windows에서 파일을 편집 할 때 WinSCP를 필요한 정확한 도구로 가져 왔습니다. WinSCP는 파일 시스템 감시 서비스를 사용하여 초기 동기화 및 지속적인 업데이트와 함께이 기능 만 제공합니다. 데이트".

리눅스에서는 동기화의 필요성을 완전히 회피하기 위해 sshfs를 사용할 수 있다고 주장 할 수 있습니다. 창문에서 삼바 공유는 똑같이 할 것입니다. 그러나 IDE가 로컬 파일 (SSD 디스크에서)과 함께 작동하기를 원하지만 네트워크를 통해 PHP 인덱싱 및 기타 작업을 수행 할 필요가 없습니다.

그럼에도 불구하고 sshfs는 솔루션의 일부일 수 있으므로 두 개의 로컬 디렉토리간에 지속적인 동기화가 필요했습니다.

아이디어 나 조언이 있습니까?


창 아래에서 직접 파일을 조작 할 수 있도록 rsync 도구를 사용하거나 웹 서버의 문서 루트에서 폴더를 공유하는 것이 좋습니다.
Vinicius Kamakura

2
rsync는 "one go"입니다. 지속적인 업데이트가 필요합니다. 여기서 전체 요점입니다. 파일을 편집하고 저장하면 요청한 제품 / 시스템 / 아이디어에서이 저장 작업을 선택하고 새 버전을 즉시 업로드합니다. NB : 양쪽은 리눅스입니다. NB2 : 로컬 파일을 편집하고 싶습니다. 그렇지 않으면 sshfs 자체가 잘라냅니다.
stolsvik

6
주제를 벗어난 유권자들에게, 이것은 경계 사례이지만, FAQ의 "프로그래머가 일반적으로 사용하는 도구"에 해당되는 것으로 생각됩니다.
Karl Bielefeldt

완벽하게 일치하지는 않지만 overlayfs를
phs

답변:


57

inotifywaitinotify-tools 패키지 에서도 사용할 수 있습니다 .

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done

13
inotify를-도구 웹 사이트 , rsync에 트리거 할 inotify를-대기를 사용하는 아주 좋은 사례가있다.
Karl Bielefeldt

나는 지난 밤에이 정확한 것을 찾고 있었다! 아 나는 수퍼 유저 사랑
CenterOrbit

이 작업을 수행하지만 소켓을 열어 두는 방법이 있습니까? rsync/ scpssh 연결을 설정하는 동안 성가신 지연이 있습니다.
플래시

1
@Flash 예, SSH 멀티플렉싱 을 사용 하여 소켓을 열어 둘 수 있습니다 .
Will Angley

31

Lsyncd가이 를위한 좋은 솔루션입니다.

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

결론적으로, 다른 답변에서 제안한 것과 같은 종류의 도구를 사용하여 작업 (inotify 및 rsync)을 수행하지만 쉘 스크립팅에 익숙하지 않은 사람을 위해 설정하는 것이 더 쉽습니다.


더 쉬울뿐만 아니라 재 동기화없이 디렉토리 이동과 같은 상황을 처리하려고합니다.
Ciantic

5
주의 :이 프로그램에는 문제가있는 기능이 있습니다. 이 글을 쓰는 현재 : 1. 기본적으로 소스에없는 원격 파일을 삭제합니다. 2. "원격 :"은 홈 폴더 대신 "원격 : /"을 나타냅니다. 3. 데몬이 작동하므로 무슨 일이 일어나고 있는지 알 수 없습니다. TERM 신호를 즉시 존중하지 않습니다.
Friedrich

27

내 코드는 원격 상자에서 실행해야하고 로컬 컴퓨터에서 코드를 작성하기 때문에 이것이 많이 필요합니다. 로컬 폴더를 지속적으로 모니터링하고 원격 또는 로컬 폴더와 동기화하는 데 사용할 수있는 멋진 도구를 찾았습니다 : https://github.com/axkibe/lsyncd

ssh를 통해 로컬 디렉토리를 원격 시스템과 지속적으로 동기화하는 간단한 명령은 다음과 같습니다.

lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>

다른 rsync 명령과 마찬가지로 폴더 경로를 올바르게 지정하고 명령을 실행하기 전에 확인하십시오. 올바른 대상 디렉토리를 제공하지 않아서 원격 시스템 중 하나를 거의 죽였습니다. 원격 경로를 놓치지 말고 수행중인 작업을 모르는 경우 '/'를 사용하지 마십시오.


이것은 게시 된 지 3 년이 지난 후에도 훨씬 더 많은지지를받을 자격이 있습니다.
FliiFe

훌륭하게 작동하고 마침내 Mac OS Sierra에서 작동하게 되었죠.
Erik van de Ven

2

파일 시스템을 관찰해야한다면, inotify가 그 방법입니다. 파일 시스템이 변경되면 동기화를 수행하기 위해 pyinotify 를 사용하여 간단한 파이썬 스크립트를 작성 합니다. 설명서를 참조하십시오 . 영감을 얻으 려면 autosync.py 를 확인하십시오 . 즐기세요


1

한 번 한 일은 ls -l루프에서 실행 되고 (잠자는 동안) bash 스크립트 가 이전 출력과 비교되는 것입니다. 변경된 경우 동기화를 수행하십시오.

#!/bin/bash

listcommand="ls -l $*"

newfilelist=$( $listcommand )
while true
do
   if [[ $oldfilelist != $newfilelist ]]
   then
      oldfilelist=$newfilelist
      # run your synchronization tool
   fi
   sleep 10 || exit 2 
   newfilelist=$( $listcommand )
done

파일 이름을 인수로 사용하여 새 터미널에서이 스크립트를 시작하십시오 (동기화 도구에 넣은 후).

(동기화하지 않고 컴파일을 시작하기 위해 이것을 사용했지만 비슷한 방식으로 작동합니다.)


-1

훨씬 더 간단한 접근법 :

samba (또는 nfs)를 사용하여 / var / www를 내보내고 서버에서 직접 파일을 작업하십시오.

또 다른 솔루션 : 대부분의 IDE는 다양한 배포 구성을 허용합니다. 자신에게 적합한 구성이 있는지 확인하십시오.

또는 Git, Bazaar 등과 같은 소스 코드 관리 시스템을 설정하십시오.

행운을 빕니다 !!


3
대답 해줘서 고마워. 그러나 나는이 질문 에서이 접근법을 구체적으로 배제했습니다.
stolsvik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.