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


14

다음을 /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)

답변:


14

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

$ 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: [...] 감시 디렉토리 내에 새 디렉토리가 작성 되면 자동으로 감시됩니다.

편집 : 두 예제 사이에 약간 혼란 스러웠지만 첫 번째 경우 사용자가 전화했기 때문에 시계가 올바르게 배치 inotifywatch되었습니다 ~/*(확장, don_crissti의 의견 참조 ). ~/.*포함되어 있기 때문에 홈 디렉토리도 감시 ~/.됩니다. 이론적 ~/..으로는 -r스위치 와 결합 하여 전체 시스템을 감시해야하는을 포함해야합니다.

그러나, 이다 a는 트리거 파일의 이름을 얻을 수 만들 감시 된 디렉토리에 이벤트를 아직 내가 추측하고있어 inotifywatch(이 디렉토리 이름보다 더 깊은 조금 저장)이 정보를 검색하지 않습니다. inotify-tools이라고 불리는 또 다른 도구를 제공하며 inotifywait,보다 비슷한 동작을 할 수 있으며 inotify-watch더 많은 출력 옵션을 제공합니다 ( %f여기서 찾고있는 것 포함) :

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

에서 맨 페이지 :

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

%f: 이벤트가 디렉토리 내에서 발생하면 이벤트를 일으킨 파일 이름으로 바뀝니다 .

%e: 발생한 이벤트 (쉼표로 구분)로 교체되었습니다.

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


1
.bashrcserverfault사용자가 홈 디렉토리를 재귀 적으로 모니터링하기 때문에 @ 가 통계에 나타나지 않지만 path/.*확장되어 결과적으로 path/( .bashrc포함) 아래의 모든 .files에 대해 시계가 설정됩니다 . OP가 사용하는 명령은 감시가 설정 /tmp되고 하위 디렉토리가 포함되므로 통계는 하위 디렉토리에만 적용되므로 파일 이름을 출력 /tmp하지 않습니다. 이름).
don_crissti

@don_crissti 죄송합니다. OP에서 제공 한 두 가지 예를 섞었습니다. 답변을 편집했습니다. 감사합니다.
John WH Smith

고마워, 그것은 유용했다. 여기에 새로 만든 모든 테스트 * 파일의 내용을 표시하는 내 명령은 /tmp: inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null.
kenorb 2009 년

또한 " 시계를 배치 한 후 작성된 파일에서 발생하는 모든 이벤트는 감지되지 않습니다. "포함 디렉토리에 대해 시계가 이미 설정되어 있기 때문에 모든 파일 (심지어 파일 작성)이 감지됩니다. 해당 특정 디렉토리에 대한 통계에 반영됩니다. inotifywatchOP 질문의 출력을 참조하십시오 : 2 개의 create이벤트가 있으므로 감지되므로 inotifywatch디렉토리 (+ 모든 하위 디렉토리)를 감시하므로 통계는 해당 디렉토리에만 적용됩니다.
don_crissti

1
나는 우리가 여기서 같은 파장에 있다고 생각하지 않습니다 ... man inotify: When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.또한, man inotifywatch어떤 이벤트 가보고 있는지 분명합니다 : EVENTS>> ... 감시 된 파일 또는 감시 된 디렉토리 내의 파일 에 액세스 / 닫힘 / 열기 / 기타 ( "파일에서 발생하는 이벤트 " 포함 ) 부모 디렉토리에서 감시를 설정 한 후 생성 된 파일의 이벤트는 inotifywatch통계에 감지 및 반영됩니다 (이 이벤트가 발생한 파일에 대해서는 언급하지 않음).
don_crissti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.