2010-05-26 2 views
1

mod_perl에서이 프로젝트를 실행하면 호스트에 대한 정보가 표시됩니다. 이 페이지에는 사용자가 호스트를 ping/nslookup/traceroute 할 수있는 드롭 다운이있는 텍스트 상자가 있습니다. 출력은 tail -f과 같은 텍스트 상자에 표시됩니다.mod_perl에서 Perl을 사용하여 'Jobs'테일러링

CGI에서 잘 작동합니다. 사용자가 핑 (ping)을 요청하면 AJAX 호출을 서버로 보내면 기본적으로 임시 파일로 출력되는 핑이 시작됩니다. 그 다음에 이어지는 ajax 호출은 파일을 '꼬리'(tail)하여 출력이 ping이 완료 될 때까지 갱신되도록합니다. 작업이 끝나면 임시 파일이 제거됩니다.

그러나 mod_perl에서 어떤 일을 하든지 나는 좀비 프로세스를 만드는 것을 멈출 수 있습니다. IPC::Run 등을 사용하여 모든 것을 시도해 보았습니다. 결국 시스템 호출은 mod_perl 하에서는 권장되지 않습니다.

제 질문은 아마도 더 좋은 방법이있을 수 있습니다. 커맨드 라인 작업을 생성하고 mod_perl 하에서 작동 할 테일링 출력을 생성 할 수있는 CPAN 모듈이 있습니까? 나는 단지 몇 가지 제안을 찾고있다.

나는 내가 일종의 '작업'데몬을 만들 수 있음을 알고 있으며, 세부 사항을 알려주고 업데이트를 받는다. 명령을 실행하고 상태 등을 추적합니다. 그러나 더 간단한 방법이 있습니까?

미리 감사드립니다.

+0

브라이언 디 포이의 도움이 도움이되는지 확인하십시오. http://stackoverflow.com/questions/2711520/how-can-i-run-perl-system-commands-in-the-background/2715086#2715086 – DVK

+0

예 그 게시물에서 CPAN 모듈 중 일부를 보았습니다. 나를 좋은 방향으로 인도했다. 하지만 AJAX 스크립트가 호출 될 때마다 작업 상태를 유지하는 모듈이 필요합니다. 이는 AJAX 스크립트가 호출 될 때마다 작업 상태 (ID 또는 무언가)에 관계없이 file/db /에서로드 할 수 있습니다. 누구든지이 작업을 수행하는 CPAN 모듈을 알고 있습니까? 계속 찾아 볼게. – Matthew

+0

솔직히 말하면 솔직하게 말해서 원래 작업에 대한 고유 한 ID (예 : $$ 및 timestamp의 조합)를 만들고 파일 이름에 통합 한 다음 원래 요청에서 ID를 반환합니다. 페이지에 저장된 ... 각 AJAX 호출은 ID를 서버로 전송하고 로그를 읽는 스크립트는 로그 파일 이름을 다시 구성합니다. – DVK

답변

0

나는 짧은 시간을 보냈고 CPAN에는 운이 없었기 때문에 여기서 해결책을 제시 할 것입니다. 나는 즉시 뭔가를해야만했다.

이 예제에서는 ping을 사용합니다.

사용자가 ping을 요청하면 AJAX 스크립트는 ping 세부 정보 (호스트, 간격, 개수 등)가있는 레코드를 데이터베이스에 작성합니다. 레코드에 자동 증가 ID 필드가 있습니다. 그런 다음 SIGHUP을 작업 데몬으로 보냅니다.이 데몬은 단지 데몬 화 된 펄 스크립트입니다.

이 작업 디먼은 SIGHUP을 수신하고 데이터베이스에서 새 작업을 찾아 각각을 처리합니다. 새로운 작업이 생기면 PID와 '실행 중'상태를 DB 레코드에 기록하고 고유 한 작업 ID를 기반으로 stdout/stderr 파일을 열고 IPC::Run을 사용하여 STDOUT/STDERR을 이러한 파일에 지정합니다.

작업 데몬은 꼬리

출력의 AJAX 스크립트가 브라우저에 작업 ID를 다시 보내는 등 너무 오래 실행하면 그들을 죽이는 갈래의 작업을 추적합니다. 그런 다음 Javascript 타이머에서 AJAX 스크립트가 호출되어 기본적으로 데이터베이스 레코드를 통해 작업 상태를 확인하고 파일을 처리합니다.

ping이 완료되면 작업 디먼이 레코드 상태를 '완료'로 설정합니다. AJAX 스크립트는 이것에 대해 정기적 인 상태 확인을합니다.

내가 이런 식으로 한 이유 중 하나는 AJAX 스크립트와 작업 데몬이 대화하고 인증 된 수단 (DB)이라는 것입니다.

관련 문제