2014-11-14 2 views
0

특정 유형의 파일 이름 (* .monitored)에 대한 디렉토리 트리를 모니터링하는 작은 응용 프로그램이 있습니다. 일치하는 파일 수를 계산하고, inotify를 사용하여 추가 또는 삭제되는 파일과 일치하는 다양한 이벤트를 모니터하고, 현재 파일 수 및 몇 가지 파일이 추가되거나 제거 된 평균 속도를 폴링하여보고 할 수 있습니다 초. 디렉토리 트리는 수십만 개의 파일을 포함 할 수 있으므로 모니터링되는 파일의 목록을 유지하지 않도록 노력하고 있습니다.linux inotify rename() 덮어 쓰기 이벤트

나는 실행하는 경우 :

touch foo.monitored 

내가 IN_CREATE을 얻고, 내가 NUM_FILES을 설정 =

touch foo.ignored 

내가 IN_CREATE이 그것을 무시하고 NUM_FILES = 1

mv foo.ignored foo.monitored 
을 떠날 수 1

생성 :

IN_MOVE 무시한 foo.ignored에 대한 D_FROM이므로 새 파일로 가져 오는 foo.monitored의 경우 num_files = 1

IN_MOVED_TO가되므로 새 파일로 가져 오므로 num_files = 2로 설정하면 이전 foo.monitors가 덮어 썼습니다. 잘못된.

이전 foo.monitored의 종료를 알리는 이벤트를 찾을 수 없습니다. 파일 이름의 거대한 구조를 유지하지 않고 원하는 것을 할 수있는 방법이 있습니까?

감사합니다.

+0

투표를 종료 한 사람은 댓글을 남겨 두어야합니다. 이것은 꽤 잘 정의 된 질문처럼 보입니다. –

답변

0

아니요, inotify가 여기 도움이되지 않습니다. 이 경우 삭제 이벤트가 발생하지 않습니다.

모호한 신호가 발생할 때마다 각 디렉터리에 모니터링되는 파일의 수를 기록한 다음 해당 디렉터리를 다시 검색하는 것이 문제입니다.

그러나 디렉토리 트리를 모니터링하기 위해 inotify를 사용하는 것이 더 큰 문제입니다. 수천 개의 모니터링 된 파일이있는 디렉토리가 트리 안팎으로 이동하면 어떻게 될지 고려 했습니까? 트리 내의 디렉토리 이동도 문제가됩니다.


편집 : 다른 아이디어 :

  1. 개별적으로 각 파일상의 inotify를 시계를 추가합니다. 이것은 아마도 좋은 계획이 아닙니다.

  2. 카운터는 읽을 때만 정확합니다. 카운트를 읽고 그 다음에 읽혀지는 것과 일치 할 것으로 기대하는 호출자는 곤란한 경쟁 상태의 버그가 발생하기를 기다린다. 따라서 카운터가 조금 잘못 될 수 있다는 사실을 수락하고 기회를 얻을 때 카운터를 수정하는 것이 좋습니다.

  3. 5 회의 이동 이벤트마다 전체 검사를 수행하십시오.

  4. 이동 이벤트가 발생하면 30 초 후에 더 이상 있는지 확인한 다음 검색을 수행하십시오.

  5. 트리를 섹션 ("버킷")으로 분할하고 각각에 대해 개수를 기록하십시오. 이렇게하면 검색 오버 헤드가 줄어 듭니다.

  6. 모니터링되는 각 파일 경로에 대해 해시를 기록하십시오. 실제 파일 이름을 기록하는 것보다 메모리/문제가 적을 수 있습니다.

+0

감사합니다. 디렉토리 트리가 잘 정의되어 있기 때문에 (예 : 오징어 캐시, dir/0/0/0/files, dir/0/0/1/files와 같이) 쉽게 들어오고가는 디렉토리를 처리 할 수 ​​있습니다. ..) 디렉토리의 하나가 옮겨지면 전체 재검색을 할 수 있지만 모든 IN_MOVED_TO에 대해 전체 스캔을해야한다면 inotify 사용을 중지 할 수도 있습니다 ... 대안적인 접근법? –

+0

각 개별 파일에 inotify 모니터를 설정할 수 있다고 가정하지만 파일 저장소를 다른 위치로 옮기는 것만으로도 어쨌든 * 할 것이 확실하지는 않습니다. – ams

+0

TBH, 전체적으로 재검색을 할 때마다 파일 수를 대략적으로 만 기록하고 경우에 따라 개수를 수정하도록 유혹 될 것입니다. 당신은 통계가 단지 몇 초간의 활동에 불과하다고 말했고,이 경우는 드물기 때문에 충분히 좋을 수도 있습니다. 어쩌면 어떤 것이 모호해질 때마다 카운터를 증가시킨 다음 어떤 임계 값에 도달 할 때 다시 스캔을 트리거 할 것입니까? – ams