디렉토리 내용이 업데이트 될 때 명령을 실행하는 방법은 무엇입니까?


27

A다른 사람들이 내용을 자주 바꾸는 디렉토리 가 있습니다.

나는 B지금까지 있었던 모든 파일을 보관 하는 개인 디렉터리를 만들었 습니다 A.

현재 rsync파일을에서로 백업하기 위해 때때로 실행 A됩니다 B. 그러나 일부 파일이에 추가 된 A다음 에 파일 A을 복사 할 수 있기 전에 제거 될 가능성이 있습니다 B.

이를 방지하는 가장 좋은 방법은 무엇입니까? 이상적으로는 내용 A이 변경 될 때마다 현재 백업 스크립트를 실행하고 싶습니다 .

답변:


29

당신이있는 경우 inotify를-도구를 사용할 수있는 설치 inotifywait파일이나 디렉토리에 기록되어있는 경우 작업을 실행하는 데 :

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done

를 Where -qq스위치가 완전히 침묵, -r재귀 (필요한 경우) 및 -e이 경우, 모니터에 이벤트이다 modify. 보낸 사람 man inotifywait:

수정
감시 파일 또는 감시 디렉토리 내의 파일이 기록되었습니다.

5
incrond또한 관심이있을 수 있습니다.
숀 J. 고프

1
시원한. 위의 스크립트를 bashrc에 넣어서 로그인 할 때 실행되도록 하시겠습니까? 항상 실행할 수있는 다른 방법이 있습니까?
oadams

로그인의 경우 /etc/profile시스템 전체 또는 .bash_profile사용자의 경우 예입니다. 부팅 후 실행하려면 유닉스 / 리눅스의 특성에 따라 다릅니다. /etc/rc.local, /etc/rc.d/또는/etc/init.d/
jasonwryan

1
더 큰 디렉토리의 경우 --monitor스위치 사용을 고려 하고 출력을 루프로 파이프하는 것이 좋습니다. 그렇지 않으면 계속 inotifywait해서 다시 시작할 때 많은 오버 헤드 가 있습니다.
Tobias Kienzler

이 솔루션은 FTP 서버를 통해 디렉토리 트리에 추가 된 각 파일에 대해 스크립트를 실행하는 데 얼마나 안정적입니까 (새 파일이 평균 3 분마다 추가되고 몇 년 동안 계속 될 수 있다고 가정 해 봅시다)? 그렇지 않은 경우 대체 솔루션이 있습니까?
Nikola Novak

5

엄밀히 말하면 누군가 파일을 삭제하고 매우 빠르게 제거하면 놓칠 수 있습니다. inotify를 사용하면 (Linux에서 또는 다른 유니스에서 유사한 기능으로) 위험 창을 작게 만듭니다.

해당 디렉토리에 원하는 파일 시스템을 마운트 할 수 있다면 (이 옵션이 아닐 수도 있음) 모든 파일 버전을 기록하는 파일 시스템을 넣을 수 있습니다 (예 : copyfs) .


4

entr파일이 변경 될 때 임의의 명령을 실행할 수있는 명령 줄 도구를 사용해보십시오 . 2.9 릴리스 이후, 디렉토리 감시 옵션 ( -d)이 추가되어 새 파일이 디렉토리에 추가 될 때 이벤트에 반응합니다.

새 파일이 프로젝트에 추가 된 경우 유틸리티를 실행하는 예 :

$ while true; do
> echo src/* | entr -d your_command
> done

디렉토리 감시 모드에서 각 파일의 상위 디렉토리는 내재적으로 감시 목록에 추가됩니다.

이것의 유일한 의미는 새 파일이 나타나면 외부 쉘 루프가 파일 시스템을 다시 스캔 할 수 있도록 종료해야한다는 것입니다.

디렉토리 감시 옵션이없는 버전은 다음과 같습니다.

$ while true; do
> echo src/* src | entr your_command
> done

다음은 필요에 따라 더 간단한 예입니다.

$ ls -d * | entr sh -c 'rsync -vuar A B'

확인 : entrproject.org 웹 사이트를 자세한 내용은.


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