저는 우분투에서 작업 중이며 새 하위 디렉터리와 파일에 대한 디렉터리 트리를 모니터링해야 합니다. 이는 rsync에 의해 채워지며 1초 이내에 수백 개의 파일을 추가할 수 있습니다. 몇 가지 옵션을 고려 중입니다.
옵션 1: Python의 inotify.adapters.InotifyTree()를 사용하여 트리를 모니터링합니다. 하지만문서다음 경고가 포함되어 있습니다: "중요한:경로의 재귀 모니터링은 커널 제공 기능이 아닙니다. 대신 인위적으로 구현합니다. 디렉터리 생성 이벤트가 수신되면 즉시 하위 디렉터리에 대한 감시를 생성합니다. 이는 잠재적인 경쟁 조건이 있음을 의미합니다. 디렉터리가 생성되고 (event_gen() 루프를 사용하여) 디렉터리를 관찰하기 전에 그 안에 파일이나 디렉터리가 생성되면 문제가 발생합니다. 파일인 경우 , 그러면 해당 생성과 관련된 이벤트를 놓칠 수 있지만 디렉터리인 경우 해당 생성 이벤트를 놓칠 뿐만 아니라 라이브러리도 이를 놓칠 것이며 이에 대한 모니터링을 추가할 방법이 없습니다. "
옵션 2: '--recursive' 옵션을 사용하여 Linux inotifywatch 유틸리티를 통해 트리를 모니터링합니다.이 문서다음 경고를 포함하세요: "경고하다:큰 트리의 루트를 모니터링할 때 이 옵션을 사용하면 모든 inotify 모니터링이 설정되는 데 시간이 꽤 걸릴 수 있으며, 이때 아무런 이벤트도 수신되지 않습니다. "
이 두 가지 옵션 중 새로운 하위 디렉터리와 파일을 놓칠 가능성이 가장 낮은 옵션은 무엇이라고 생각하시나요? 내 생각에는 inotifywatch가 (아마도) "C"로 구현되었기 때문에 옵션 2가 더 안정적일 것 같습니다. 감사해요!
답변1
문제를 제대로 이해하는 것부터 시작하겠습니다. 두 설명서에서 읽은 경고는 "제한 사항 및 경고"에서 나온 것입니다.남자 7 이노티파이:https://man7.org/linux/man-pages/man7/inotify.7.html
이는 커널 제한으로 인해 발생하므로 이해하는 것이 중요합니다.둘 다일부 소프트웨어에는 해당 설명서에 언급되어 있지 않더라도 동일한 문제가 있을 수 있습니다.
내 추측으로는 대부분의 사용자에게 관련이 없을 가능성이 높기 때문에 informwatch의 매뉴얼에는 경쟁 조건에 대한 언급이 없다는 것입니다. 설명서에는 다음과 같은 내용이 나와 있습니다.:
notifywatch
Linux inotify(7) 인터페이스를 사용하여 파일 시스템 이벤트를 수신한 다음 각 파일 또는 디렉터리에서 수신된 이벤트의 요약 수를 출력합니다.
소프트웨어가 새 하위 디렉터리에서 일부 파일 생성 이벤트를 건너뛰더라도 여전히 수행해야 할 작업인 통계 보고를 수행합니다.
당신은 무엇을 할 수 있나요?
나는 두 솔루션 중 어느 쪽도 필요하다고 생각되는 것만큼 완벽하다고 보장할 수 없다고 생각하며, 문제가 될 수 있다는 것을 안다면 경쟁 조건으로 인해 소프트웨어가 중단되는 것을 결코 허용하지 않을 것입니다. 모든 것이 괜찮을 것이라고 단지 “희망”하지 마십시오!
다시 inotify 7 매뉴얼에서:
그러나 강력한 애플리케이션에서는 아래에 설명된 유형의 모니터링 논리 또는 경합 오류로 인해 캐시가 파일 시스템 상태와 일치하지 않을 수 있다는 사실을 고려해야 합니다. 일관성 검사를 수행하고 불일치가 감지되면 캐시를 다시 작성하는 것이 현명할 수 있습니다.
귀하의 경우에는 경쟁 조건 주변의 코드와 함께 1 또는 2와 같은 옵션을 사용하는 것이 현명할 것입니다. 새 디렉터리가 생성되는 것을 감지하면 다음을 수행합니다.
- 새 디렉터리를 기록해 둡니다.
- 사용 가능한 모든 inotify 이벤트를 읽을 때까지 기다리십시오.
- 그런 다음 디렉터리를 스캔(
pathlib.Path.iterdir()
)하여 경쟁 조건으로 인해 누락된 파일이 있는지 확인합니다.
기다리는 방법?
사용 가능한 모든 inotify 이벤트를 기다리는 것은 까다롭습니다. 옵션 1(PyPi의 inotify)을 사용하면 짧은 시간 초과로 사용 가능한 모든 이벤트를 얻을 수 있습니다.
gen = i.event_gen(yield_nones=False, timeout_s=0.1)
검색할 새 디렉터리가 있는 경우 제한 시간을 더 짧게 설정하고 제한 시간이 만료되면 해당 디렉터리를 검색할 수 있습니다. 검색할 새 디렉터리가 없는 경우 시간 초과 없이(시간 초과 없음) 이 기능을 사용할 수 있습니다.