공유 폴더의 새 파일을 모니터링하는 스크립트(Windows 호스트, Linux 게스트)

공유 폴더의 새 파일을 모니터링하는 스크립트(Windows 호스트, Linux 게스트)

새 파일이나 변경된 파일을 보려면 공유 폴더를 모니터링해야 합니다. 이 특정 경우 호스트는 Windows이고 게스트는 Ubuntu Linux입니다. 이상적으로 이 솔루션은 파일이 공유 디렉터리에 있는 호스트나 컴퓨터와 독립적으로 작동해야 합니다. 새 파일은 다른 프로세스에 대한 입력으로 사용됩니다.

파일이 호스트에 의해 생성되어 공유 폴더에 배치된 경우 inotifywait 도구 세트는 새 파일을 감지하지 않습니다.

내 옵션은 무엇입니까?

답변1

파일이 Windows 측에서 수정되면 Linux 커널이 이에 대해 알 수 없기 때문에 변경 사항을 위해 파일을 폴링하는 것이 필요합니다. Guard와 같이 이 문제를 해결하는 데 도움이 될 수 있는 몇 가지 기존 애플리케이션이 있습니다.http://guardgem.org/

특정 요구 사항에 따라 watch파일을 나열할 수 있습니다(n초를 적절한 값으로 조정).

watch --differences -n 10 ls -l </path/to/shared/dir>

답변2

이전 투표 도구 중 하나를 사용할 수도 있습니다.통지하다그리고inotify:노름또는가족, 그리고 다음과 같은 것들파일이 변경되었습니다.이는 inotifywaitCLI와 유사한 도구입니다. gamin과 fam 프로젝트는 서로 관련되어 있으며 둘 다 꽤 오래되었습니다(gamin은 약간 덜하지만).

간단하고 휴대 가능한 작업을 위해 내가 사용한이 같은예약된 작업을 통해:

if mkdir /var/lock/mylock; then
  ( cd /mnt/mypath; find . -type f -mmin +2 ) | myprocess
  rmdir /var/lock/mylock
else
  logger -p local0.notice "mylock found, skipping run"
fi

이는 원시 잠금 및 GNU find조건을 사용하여 파일만 찾습니다.나이가 많은2분도 안 되어 파일이 완전히 작성되었음을 확신할 수 있었습니다. 제 경우에는 myprocess파일이 rsync --remove-source-files --files-from=-처리된 후 삭제되었습니다.

이 접근 방식을 사용하면 //를 사용하여 문제가 있는 파일 이름을 처리할 수도 있습니다 find -print0.xargs -0rsync -0

모든 파일(이전 파일과 새 파일)을 동일한 디렉터리 계층 구조에 유지해야 하는 경우 디렉터리 목록의 스냅샷을 만들고 비교하는 것도 도움이 될 수 있습니다.

if mkdir /var/lock/mylock; then
  ( 
    export LC_COLLATE=C  # for sort
    cd /mnt/mypath
    find . -type f -a \! -name ".dirlist.*" -printf '%p\0' | 
      while read -d '' file; do
        printf "%q\n" "${file}"  
      done > .dirlist.new
    [[ -f  .dirlist.old ]] && {
      comm -13 <(sort .dirlist.old) <(sort .dirlist.new) |
        while read -r file; do
          myprocess "${file}"
        done
    }
    mv .dirlist.new .dirlist.new
  )
  rmdir /var/lock/mylock
else
  logger -p local0.notice "mylock found, skipping run"
fi

bash스크립트는 다음과 같습니다.

  1. find -printf\0(nul)으로 구분된 파일 목록을 인쇄하는 경우
  2. read -d ''목록을 처리하고 printf %q필요한 경우 파일 이름을 이스케이프하는 데 사용됩니다.
  3. 새 파일과 이전 .dirlist 파일 비교
  4. 각각의 새 파일 호출 myprocess(안전한 참조)

(또한 처리 중수정됨find ... -printf '%p\0%s %Ts\0'파일에는 두 줄 형식을 사용 하고 while루프에 관련 변경 사항을 적용하는 등 약간의 노력이 필요합니다 . )

답변3

node.js와 해당 생태계에 익숙하다면 다음을 사용할 수 있습니다.이 도서관 공유 폴더에 대한 폴링을 구현합니다.

관련 정보