inotifywatch가 추가된 파일의 변경 사항을 감지하지 못하는 이유는 무엇입니까?

inotifywatch가 추가된 파일의 변경 사항을 감지하지 못하는 이유는 무엇입니까?

/tmp다음을 사용하여 폴더의 변경 사항을 모니터링 하려고 합니다 inotifywatch.

sudo inotifywatch -v -r /tmp

몇 개의 파일( touch /tmp/test-1 /tmp/test-2)을 생성한 후 종료합니다 inotifywatch. 이를 통해 Ctrl다음 C통계가 표시됩니다.

Establishing watches...
Setting up watch(es) on /tmp
OK, /tmp is now being watched.
Total of 39 watches.
Finished establishing watches, now collecting statistics.
total  attrib  close_write  open  create  filename
8      2       2            2     2       /tmp/

출력에는 통계만 인쇄되지만 예상한 파일은 인쇄되지 않습니다(예:여기또는여기). 다양한 유형의 액세스(등 cat을 통해)를 시도했지만 mktemp결과는 동일합니다.

내가 놓친 게 무엇입니까? VPS를 사용하고 있어서 일부 콘텐츠가 제한되어 있기 때문인가요?

운영 체제: VPS의 Debian 7.3(inotify-tools)

답변1

이는 도구를 사용하는 방식 inotifywatch과 도구 자체가 작동하는 방식 때문입니다. 을 실행하면 모든 파일을 inotifywatch -r /tmp보기 시작합니다./tmp이미내부에. 에서 파일을 생성하면 /tmp새 파일의 inode 번호를 포함하도록 디렉터리 메타데이터가 업데이트됩니다. 이는 변경 사항이 에서 /tmp가 아니라 에서 발생했음을 의미합니다 /tmp/test-1. 또한 출시 /tmp/test-1당시에는 시계가 없었기 때문에 inotifywatch시계가 배치되어 있지 않습니다 .inotify이는 시계를 배치한 후 생성된 파일에서 발생하는 모든 이벤트가 감지되지 않음을 의미합니다.. 직접 눈으로 보면 더 잘 이해할 수 있을 것입니다.

$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

당신이 가지고 있다면추적 활성화inotify_add_watch(2), 마지막 명령은 설정한 시계 수를 알려줍니다 inotifywatch. 이 숫자는 자체적으로 주어진 숫자와 동일해야 합니다 inotifywatch. 이제 내부에 파일을 만들고 /tmp다시 확인하십시오.

$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

이 숫자는 증가하지 않습니다. 이는 새 파일을 볼 수 없음을 의미합니다. 디렉터리를 생성하면 동작이 달라집니다.

$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1

-r이는 스위치의 작동 방식 때문입니다.:

-r, --recursive: [...] watch 디렉터리 내에 새 디렉터리를 생성하는 경우자동으로 모니터링됩니다.

편집하다:두 가지 예를 들으니 조금 혼란스럽습니다만,첫 번째 경우, 사용자가 inotifywatch( ~/*확장,여기에서 don_crissti의 의견을 확인하세요.). 이론적 ~/.*으로 는 홈 디렉토리 ~/.도 포함되어야 하며 ~/..스위치와 결합하면 -r전체 시스템을 모니터링할 수 있습니다.

그러나 그것은트리거된 파일의 이름을 얻을 수 있습니다.만들다이벤트는 모니터링되는 디렉터리에 있지만 이 정보는 검색되지 않는 것 같습니다 inotifywatch(디렉터리 이름보다 조금 더 깊은 곳에 저장되어 있습니다). 매우 유사하게 작동 하고 더 많은 출력 옵션을 제공하는 inotify-tools이라는 또 다른 도구가 있습니다 ( 여기에서 찾고 있는 를 포함).inotifywaitinotify-watch%f

inotifywait -m --format "%e %f" /tmp

~에서매뉴얼 페이지:

--format <fmt>printf와 유사한 구문을 사용하여 사용자가 지정한 형식으로 출력합니다. [...] 다음 변환이 지원됩니다.

%f:해당 디렉토리에서 이벤트가 발생하면 해당 이벤트를 발생시킨 파일 이름으로 대체됩니다..

%e: 발생한 이벤트를 쉼표로 구분하여 대체합니다.

또한 -m옵션(모니터)은 inotifywait첫 번째 이벤트 이후에도 계속 실행되어 와 매우 유사한 동작을 재현합니다 inotifywatch.

관련 정보