왜 inotify 이벤트가 두 번 이상 발생합니까?


13

이 질문은 내가 Stackoverflow에서 제기 한 다른 질문에서 발생합니다 . 내가 사용하고 감시자를 - 같은 문제에 적용 Incron - 폴더 멀리 변화와 자동 다람쥐 보관에 이러한 변경 사항에 대한 하위 폴더를 모니터링 할 수 있습니다.

목적을 위해 write_close이벤트를 모니터링합니다 IN_CLOSE_WRITE. 원래는 modify이벤트를 보고있었습니다 ( 예 : IN_MODIFY). 이것이 작동하는 동안 큰 파일을 쓸 때 두 번 이상 실행된다는 것을 알았습니다. 그것은 공평하게 들려서 IN_CLOSE_WRITE주어진 파일에 대해 한 번만 발생한다고 가정하는 것이 합리적이라고 생각한 이후 로 전환했습니다 .

그러나 그렇지 않습니다. Nano에서 생성 된 매우 작은 텍스트 파일 (단 하나의 문자)에도 이벤트가 두 번 발생합니다. 기껏해야 동일한 파일이 Dropbox에서 두 번 동기화 될 때 불필요한 트래픽이 발생할 수 있습니다. 내 경우에는 첫 번째 이벤트에서 동기화를 수행 한 다음 서버 측 파일을 삭제하므로 재앙이 발생합니다. 결과-두 번째 이벤트에서 Dropbox 사이드 파일은 0 바이트 파일이됩니다.

다른 작업을 수행하기 전에 동기화 스크립트를 10 초 동안 절전 모드로 유지하여 Dropbox 동기화를 시도하기 전에 문제의 파일이 여전히 존재하는지 확인합니다. 두 번째 반복에서 파일이 누락되고 스크립트가 종료되기 때문에 작동합니다.

기이하게 들린다. 아마도 나쁜 해킹은 아니지만 이해하기를 원할 것입니다. 왜 IN_CLOSE_WRITE이벤트 조차도 두 번 이상 발생합니까?


추가 정보

  • 감시자의 인스턴스가 여러 개 실행되고 있지 않은지 확인하십시오.

출력 ps ax|grep watcher.py

23880 ?        Sl     0:01 python /usr/local/bin/watcher.py restart
24977 pts/0    S+     0:00 grep --color=auto watcher.py

파일 시스템은 ext4입니다. Incron에서 정확히 같은 문제가 발생했다고 언급해야합니다. 를 통해 실행되는 배치 스크립트에서 Watcher 데몬을 시작합니다 /etc/rc2.d. Incron OTH는 기본 apt-get install incron설치 를 통해 아무런 혼란없이 시작됩니다 .


watcher.ini파일 의 본질은 아래와 같습니다.

[DEFAULT]
logfile=/var/log/watcher.log
pidfile=/var/run/watcher.pid

[job1]
watch=/path/to/watch

events=write_close
excluded=
recursive=true
autoadd=true

command=/home/datastore.php $filename

datastore.php지저분한 Dropbox 업로드 + 소스 삭제 코드없이 스크립트가 두 번 실행되는지 확인하기 위해 스크립트를 필수 요소로 축소했습니다 .

#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);

?>

그런 다음 해당 경로에 작은 파일을 만든 다음 검사했습니다 /tmp/watcher. 문제는 여전히 지속됩니다. 파일에는 여전히 두 개의 연속 항목이 $argv[1]있습니다.


1
여러 변형을 시도했지만 여러 번의 IN_CLOSE_WRITE 발사로 문제를 복제 할 수 없습니다. 내가 한 일은 단일 inotify 출력을 유발합니다. 계속 노력할 것입니다. 그러나 지금까지는 질문 만 있습니다. 어떤 파일 시스템입니까? Ext4? 다른?
lornix

@lornix-내 질문에 대한 수정 사항을 참조하십시오. 파일 시스템이 ext4있으며 두 개의 Watcher 인스턴스가 실행되고 있지 않다고 확신합니다. Incron과 동일한 문제가 발생했습니다.
DroidOS

'동기화를 수행 한 다음 서버 측 파일을 삭제합니다.'라고 말했습니다. 이 삭제는 두 번째 이벤트를 트리거합니까? delete루틴 을 비활성화 하고 다시 시도 할 수 있습니까 ?
Germar

@ 독일어-내 질문에 대한 편집을 참조하십시오. 심지어와 동기화 스크립트가 진짜 동기화 중 일을하지 않고는 unlink문제의이 지속를 보내고
DroidOS

미안하지만 아이디어가 없어서 내 컴퓨터에서 문제를 재현 할 수 없습니다. 더 이상 이벤트가 하나도 없습니다. 언급되지 않은 다른 것이 있습니다. 바이러스 백신이 설치되어 있습니까? 그런 것?
lornix

답변:


1

확실하지 않지만 대부분의 첫 번째 write_close는 파일 시간을 작성 시간과 같이 파일 속성에 기록한 후에 만 ​​실제 데이터를 기록합니다. 실제로 rsync는 임시 파일을 만들고 모든 작업이 완료되면 임시 파일을 동일한 폴더의 실제 파일로 이동하므로 rsync를 사용할 때 일반적으로 모니터링하기가 쉬웠으며 이동은 원 자성 작업입니다. 다른 한편으로는, inotify에서 한 번의 호출이 있습니다. 아마도 그것을 사용하면 첫 번째 수정 메시지에서 무언가를 트리거 할 수 있으며 작업을 시작하기 전에 합리적인 시간 동안 수면을 제안했습니다. 나는 지금 이것을 파고 있으며 새로운 것을 발견하면 업데이트 할 것입니다. /superuser/1133642/traceing-the-moment-when-file-is-completely-copied-to-samba-share-with-inotify


당신은 여기에 꽤 유효한 것에 손가락을 넣었을 것입니다. 약간의 조사가 필요합니다. 팁 고마워. 나는 이것이 어떻게 든 문제가 있음을 알게되면 다시 게시 할 것입니다.
DroidOS

ATTRIB이 파일 자체에 아무것도 추가하지 않는다고 생각합니다. 잘못되었습니다.
Edik Mkoyan

0

이 의견을 의견으로 게시 할 충분한 담당자가 없지만 임시로 숨겨져있는 파일이 작성되지 않았습니까? inotifywait여러 번 발사 하는 것과 비슷한 문제가 있었지만 편집 할 때 vim이 .swp 파일을 생성하고 닫을 때 이벤트가 발생하기 때문에 이것이 발생한다는 것을 깨달았습니다. 또한 원본 파일에서 닫기 이벤트를 선택합니다.

동일한 파일에서 여러 파일을 실행하는 이벤트를 알 수있는 것처럼 들립니다. 이는 재현 할 수 없었습니다. 이는 임시 파일과 원본에 대해 한 번만 발생합니다.

나는 nano로 빠른 테스트를 시도했지만 임시 파일을 생성하지 않는다고 생각합니다 (적어도 몇 가지 경우).하지만 비슷한 동작에 의존 할 수있는 다른 것이 있습니까?


제안 해 주셔서 감사합니다. Nano로 매우 사소한 1 바이트 파일을 만들 때조차도 콘솔에서 파일로 단일 문자를 리디렉션 하여 inotify multiple 문제가 발생했습니다. 원래 질문에서 설명한 "솔루션"은 지금 계속 진행되고 있습니다. 그러나 장기적으로는 오류가 시작될 때를 식별하기 위해 처음부터 서버를 다시 작성 해야하는 유일한 솔루션입니다 .Incron, Watcher (bron은 Incron을했을 때 발생했습니다), MariaDB, Nginx, Redis, Memcached ... 정확하게 "간단한"것은 아닙니다.
DroidOS

동일한 폴더를 두 번 모니터링하지 않는 경우 다시 확인하십시오. 그렇지 않은 경우 예를 들어 os x samba 클라이언트를 통해 samba 공유에 파일을 복사하면 create, close_write, delete, create, close_write가 발생합니다 .Windows 클라이언트로 그렇게하면 더 합리적인 create, write_close 및 더 이상 아무것도 보이지 않습니다. 따라서이 IN_MODIFY, IN_ONESHOT / 디렉토리로 파일의 첫 번째 수정을 모니터링하여 문제를 해결합니다. sleep someTime 명령 oneshot이 작업을 수행합니다.
Edik Mkoyan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.