
다른 프로세스에서 생성될 새 파일에 대한 디렉터리를 모니터링하고 싶습니다. 나는 incrod
이것을 위해 그것을 사용할 계획이다 .
파일은 절대 업데이트되어서는 안 되기 때문에 파일의 변경 사항에 반응하는 데 관심이 없습니다. 그러므로 이 IN_CREATE
행사는 듣기에 현명한 선택처럼 보였습니다. 그러나 해당 이벤트를 수신하면 (다른 프로세스가 정보를 쓰기 전에) 빈 파일이 남게 될까요? 이 이벤트를 사용해야 하나요 IN_WRITE_CLOSE
?
답변1
inotifywait
프로세스가 실행되는 동안 디렉터리에 어떤 이벤트가 전달되는지 관찰하여 이벤트가 어떻게 작동하는지 확인할 수 있습니다 .
$ inotifywait -m .
Setting up watches.
Watches established.
예를 들어, touch file
동일한 디렉터리에서 실행한 후:
$ inotifywait -m .
Setting up watches.
Watches established.
./ CREATE file
./ OPEN file
./ ATTRIB file
./ CLOSE_WRITE,CLOSE file
예상한 대로 파일 생성과 닫기 사이에 지연이 있으므로 CREATE 이벤트 후에 빈 파일을 얻게 됩니다. 실행 후 어떤 일이 일어나는지 관찰하십시오.
from time import sleep
with open("somefile", 'w') as somefile:
sleep(15)
somefile.write("...")
따라서 CLOSE_WRITE 이벤트를 사용하는 것이 합리적으로 보입니다.
답변2
예, IN_CREATE
(또는 적어도 아마도) 빈 파일을 제공할 것입니다. 이름에서 알 수 있듯이 이 이벤트는 새 파일이 생성될 때 생성되며, 새 파일은 빈 상태로 생성됩니다. 알림을 받은 프로세스가 파일 읽기를 시작하면 파일이 비어 있지 않을 수 있지만 일반적으로 이때 완전히 기록되지는 않습니다.
IN_WRITE_CLOSE
완성된 문서에 반응해야 합니다. 파일을 생성한 프로세스가 충돌하면 이 이벤트가 시작됩니다. 이를 방지하기 위한 일반적인 전략은 프로세스가 파일에 쓰고 이름을 바꾸도록 하는 것입니다(아마도 다른 디렉터리로 이동). 그러면 모니터가 들을 것입니다 IN_MOVED_FROM
.