2010-07-16 2 views
5

Linux에서 inotify를 사용하여 디렉토리를 모니터 할 때, 우리는 파일이 생성되자 마자 알림을받습니다 (다른 프로세스가 쓰기를 끝내기 전에 그것을)파일 쓰기를 마치기 전에 파일을 읽지 않도록하는 방법

다른 프로세스가 파일을 쓰기 전에 파일을 읽지 않도록하는 효과적인 방법이 있습니까?

잠재적으로 지연된 읽기를 추가 할 수 있습니다. 그러나 우리 모두가 알듯이, 그것은 결함이 있습니다.

시나리오에 대해 좀 더 명확히하기 위해; 두 프로세스가 다른 사용자로 실행 중입니다. 예상되는로드는 초당 약 수백 개의 파일입니다.

+0

한 번에 하나의 프로세스 만 파일을 사용하도록 각 파일에 대해 이름이 지정된 세마포를 만들 수는 없다고 생각합니까? – Gianni

+0

"finish"를 정의하십시오. 프로세스가 파일을 닫지 않는 한 원칙적으로 프로세스가 프로세스를 "완료"했는지 여부를 판단 할 수 있습니까? – Cogwheel

+0

파일을 읽거나 쓰는 프로그램을 제어 할 수 있습니까? 그렇지 않으면 "모든 타사 프로그램"과 함께 사용해야합니까? –

답변

1

질문에 따라 현재 IN_CREATE (아마도 IN_OPEN) 플래그로 디렉토리를 모니터링하고있는 것 같습니다. 파일을 닫을 때 알림을받을 수 있도록 IN_CLOSE 플래그를 사용하지 않는 이유는 무엇입니까? 거기에서 파일이 열려 있는지 여부를 추적하는 것이 쉬워야하며 아직 읽지 않으려한다는 것을 알게됩니다.

+0

감사합니다 jamessan; 귀하의 회신은 저에게 효과가있는 해결책을 찾는데 도움이되었습니다. 이제 IN_CREATE 및 IN_CLOSE에 대해 모니터링합니다. 그들을 결합하여 내가 모니터링하고있는 디렉토리에 새로운 도착을 선택하십시오! 도와 주셔서 감사합니다. –

0

/proc/<pid>/fd을 확인하여 파일이 아직 열렸는지 확인할 수 있습니다. 거기에 없으면 프로세스가 더 이상 사용하지 않는다는 것을 확신 할 수 있습니다.

+0

은 fd 파일을 찾을 수있는 방법입니다.이 파일은 외국 프로세스에서 열 수 있습니다. 나는 들어 본 적이 없다. AFAIK, fd는 특정 프로세스이며 OS와 프로세스 만이 fd와 디스크상의 파일 사이의 관계를 알 수 있습니다. 모든 방법이 있다면, 나는 그것이 뿌리까지만 사용할 수있을 것이라고 확신합니다. –

+0

@CodeMedic dir을보세요. fd는 파일 자체에 대한 심볼릭 링크이므로 fd -> name을 변환 할 필요가 없으므로 링크가 가리키는 파일을보기 위해'lstat'을 사용하면됩니다. – Gianni

+0

예 : user @ box : ~ # ls -l/proc/1433/fd/0 lr-x ------ 1 루트 루트 64 2010-07-16 15:31/proc/1433/fd/0 ->/dev/null – Gianni

1

다른 곳에서 만들거나 쓰거나 닫은 다음 이름을 변경하십시오. 또는 확실하지 않은 것이 있습니까?

+0

그래,이게 옳은 방법이야. 또는 임시 이름으로 작성하고 완료되면 이름을 바꿉니다. – MarkR

+0

프로세스에 대한 제어 권한이있는 경우에만 해당됩니다! 여기 나는 없다! 그것의 제 3 자 조각. –

-1

어쩌면 lsof 명령이 도움이 될 수 있습니다. 열려있는 모든 파일을 나열합니다. $ man lsof

+0

여기에서 질문은 셸에서 복사본을 만드는 것에 관한 것이 아닙니다. –