2010-02-25 6 views
5

저는 Dazzle이라는 USPS 배송 패키지와 인터페이스하는 시스템을 개발 중입니다. 이 시스템의 일부는 모니터링 데몬을 포함합니다.이 데몬은 탭으로 구분 된 값 파일을 가져 와서 Dazzle이 인식 할 수있는 XML로 변환 한 다음 레이블 생성을 위해 눈을 부시게합니다. 그리고이 부분은 잘 작동합니다. 그러나 Dazzle이 생성 한 출력 파일을 구문 분석하여 데이터베이스로 가져 오는 것도 제가하고 싶은 것입니다.Windows 프로그램이 SAMBA를 통해 액세스하는 파일 작성을 중단 한 시점을 Linux 데몬이 어떻게 알 수 있습니까?

Dazzle은 Windows에서 실행됩니다. 내 모니터링 데몬은 Perl로 작성되었으며 Linux에서 실행됩니다. 제 리눅스 시스템은 삼바를 통해 마운트 된 Dazzle의 입출력 디렉토리를 가지고 있습니다.

Dazzle이 출력 파일을 쓰는 시간과 출력이 완료되는 시간 사이에 측정 가능한 지연이 있습니다. 내가 알고 싶은 것은 Dazzle이 출력 파일을 쓰는 것을 기다릴 수있는 방법입니다. 나는 파일을 열어보고 그것에 flock($fh, LOCK_SH)을 해보려고했으나 아무런 효과가없는 것처럼 보였다.

EDIT : 아래의 "mobrule"의 의견을 기반으로 한 아이디어가 있습니다. Dazzle은 출력 파일을 XML로 작성합니다. 발송물의 각 패키지는 태그로 묶여 있으며 전체 문서는 태그로 묶여 있습니다. 따라서 파일이 완성되기 전에 파일을 읽기 시작하면 조치를 취하기 전에 적절한 닫는 태그를 기다릴 수 있습니다.

또한 현재 내가하고있는 일을 언급해야합니다. 출력 XML 파일이 생성되었음을 감지하면이를 구문 분석합니다. 구문 분석에 실패하면 잠자기 후 다시 시도하십시오. 실패하면 다시 두 번 자고 다시 시도하십시오. 이것은 64 초의 시간 초과로 테스트 할 때 꽤 잘 작동합니다.

답변

1

이것은 대단한 해결책은 아니지만 파일의 이름을 반복적으로 변경하고 실패 할 경우 약간 잠자기를 시도 할 수 있습니다.

1

잠금을 사용하여 잠금을 시도해 볼 수 있습니다. 잠금에 실패하면 여전히 기록 중입니다. 당신이 자물쇠를 얻을 때까지 그렇게 회전하고, 현혹해야합니다. Dazzle이 파일을 닫고 모드를 추가하여 다시 열면이 작업은 실패합니다. 따라서 최상의 해결책은 아닙니다.

+0

Dazzle이 동일한 잠금 메커니즘을 사용하여 파일을 잠그는 경우에만 해당됩니다. Dazzle이 Perl 스크립트가 아닌 경우에는 그렇지 않을 가능성이 높습니다. – mob

+0

좋은 지적입니다. Dazzle은 Windows 응용 프로그램이며 Perl로 작성되지 않았습니다. 따라서 Perl의 파일 잠금은 "권고"일 뿐이므로 작동하지 않습니다. 동정, 그렇지 않다면 그것은 내가들은 최고의 해결책이다. –

1

Dazzle이 Dazzle이 파일 쓰기를 완료했음을 나타 내기 위해 더미 또는 플래그 파일 (날짜/시간 스탬프 또는 시퀀스 번호와 같은 항목을 포함 할 수 있음)을 쓸 수 있습니다. 그런 다음이 파일의 존재를 테스트하여 작업이 완료되었음을 알립니다.

5

일부 프로세스에 임의의 파일에 대한 열린 파일 핸들이 있는지 알려주는 일반적인 방법과 이식 방법은 없습니다. 상황에 대한 현지 지식으로 판단해야합니다.

이 경우 Windows 컴퓨터에서 프로세스 테이블을 쿼리하여 "Dazzle"프로그램이 아직 실행 중인지 확인할 수 있습니다. 또는 "Dazzle이 입력이 적당 할 때 Dazzle을 실행하는 데 20 초 이상 걸리지 않습니다."또는 Dazzle이 실행 중일 때 2 초마다 파일을 업데이트하는 등의 다른 지침을 제공 할 수 있습니다. 파일이 업데이트되지 않은 경우 말하자면, 10 초 정도면, Dazzle이 끝난 아주 좋은 기회입니다. "

하지만 Dazzle이 끝날 때까지 기다릴 필요는 없습니다. Dazzle이 파일을 쓰는 것과 동시에 파일을 읽는 것은 완벽합니다. the perldoc for the seek function을 참조하십시오. "how to emulate tail -f"에 대한 부분에 유의하십시오. 그런 다음 Dazzle이 실행되는 동안 데이터베이스를 업데이트 할 수 있습니다.

Dazzle이 끝났을 때 추측하기에는 너무 보수적 인 경우 데이터베이스가 적시에 업데이트되며 EOF의 파일 핸들에서 검색 및 읽기 호출 만 수행하면됩니다.

+0

Dazzle의 XML 출력을 파싱 한 결과에서 데이터베이스를 업데이트하고 있기 때문에 Dazzle이 실행되는 동안 실제로 데이터베이스를 업데이트 할 수 없습니다. 아마도 파서를 찾거나 내 자신의 사소한 파서를 작성할 수는 있지만 문서를 구문 분석하기 시작해야 할 필요는 없습니다. –