새 파일이나 변경된 파일을 보려면 공유 폴더를 모니터링해야 합니다. 이 특정 경우 호스트는 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:노름또는가족, 그리고 다음과 같은 것들파일이 변경되었습니다.이는 inotifywait
CLI와 유사한 도구입니다. 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 -0
rsync -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
스크립트는 다음과 같습니다.
find -printf
\0(nul)으로 구분된 파일 목록을 인쇄하는 경우read -d ''
목록을 처리하고printf %q
필요한 경우 파일 이름을 이스케이프하는 데 사용됩니다.- 새 파일과 이전 .dirlist 파일 비교
- 각각의 새 파일 호출
myprocess
(안전한 참조)
(또한 처리 중수정됨find ... -printf '%p\0%s %Ts\0'
파일에는 두 줄 형식을 사용 하고 while
루프에 관련 변경 사항을 적용하는 등 약간의 노력이 필요합니다 . )
답변3
node.js와 해당 생태계에 익숙하다면 다음을 사용할 수 있습니다.이 도서관 공유 폴더에 대한 폴링을 구현합니다.