2009-11-14 1 views
1

웹 인터페이스를 구축하여 임베디드 시스템을 모니터링하고 있습니다. 원격 명령을 실행하고 해당 시스템의 출력을 수집하는 Perl 스크립트를 작성했습니다. 이제이 스크립트 (원격 명령 실행)를 호출하고 웹 페이지에 데이터를 표시하는 웹 인터페이스가 필요합니다.Perl CGI 스크립트가 웹 서버의 데몬과 어떻게 통신 할 수 있습니까?

우선 스크립트를 웹 서버의 요청을 받아 들일 수있는 데몬 프로세스 으로 만들어야합니다. 이 Perl 스크립트와 통신 할 수있는 한 모든 서버 측 기술을 선택할 수 있습니다. 간단하게하기 위해이 데몬 Perl 스크립트와 대화 할 수있는 Perl/CGI를 선택할 수 있습니다.

이 데몬 스크립트와 통신하는 가장 좋은 방법은 무엇입니까? 나는 통신이 — 소켓 또는 다른 것일 필요가있는 방법을 결정하지 않았습니다.

이미 전달되는 메시지를 더 쉽게 전달할 수있는 Perl 모듈이 있나요? 의사 소통이 어떻게 이루어지는 지 걱정하지 않고 있습니까? 일반 텍스트로 원격 명령을 가지고 있으며 데이터를 XML/JSON으로 되돌리고 싶을 수도 있습니다. 당신이 그런 짓을 할 것처럼

답변

1

기존 Perl 스크립트를 Perl/CGI 스크립트에서 직접 실행할 수없는 이유를 설명하지 않았습니까? 반대로

client ⇒ apache ⇒ your CGIzed existing script ⇒ embedded system 

: 또 다른 통신 채널을 생성 포함하지 않기 때문에 이것은 나에게 가장 쉬운 경로를 보인다

client ⇒ apache ⇒ new CGI script ⇒ existing script ⇒ embedded system 

나는 이유는 당신이 CGI 스크립트가 여러 실행하는 기대 가정 동시에 임베디드 시스템은 여러 개의 연결을 처리 할 수 ​​없습니다.

그러나이 경우에도 직렬화의 유일한 목적을위한 데몬은 과도한 것처럼 보입니다.당신은 같이 중요한 통신 코드를 보호하기 위해 CGI 스크립트에서 잠금을 사용할 수 있습니다은 "crital 코드"부분은 기존의 스크립트를 포함, 또는를 실행할 수 있습니다 그 중 하나

open(my $lock, ">", $lockfilename); 
flock($lock, LOCK_EX); 
... critical code... 
flock($lock, LOCK_UN); 

참고.

이 모든 경우에도 여전히 명령 디먼에서 CGI를 분리하려는 경우, 여기에는 소켓 기반 통신의 클라이언트 및 서버 부분에 대한 템플리트가 있습니다. 첫째, CGI의 일부인 클라이언트 :

use IO::Socket::INET; 
$sock = IO::Socket::INET->new('localhost:9000'); 
print $sock "Comand\n"; 
$result = <$sock>; 
... do something with the result ... 
$sock->close; 

그리고이 주요 데몬 루프 :

package MyServer; 
use base Net::Server; 
sub process_request { 
    my $self = shift; 
    while (<STDIN>) { 
     chomp; 
     print "This is my answer to the command '$_'.\r\n"; 
    } 
} 
MyServer->run(port => 160); 
+0

귀하의 회신에 감사드립니다. 내가 한번 볼게. 내가 분리되어 있기를 원하는 이유는 각각의 임베디드 시스템에 대해 웹 페이지를 통해 원격 명령을 모니터/실행하라는 요청을 보내는 사용자 각각에 대해 다중화하고자하는 단일 연결이 있기 때문입니다. 그리고 나는 그러한 임베디드 시스템을 여러 개 가지고 있으며, 사용자는 다른 페이지에서 동시에 하나 이상의 것을 모니터링 할 수 있습니다. 또한 나는 미래에 콘솔 기반 응용 프로그램을 통해 동일한 기능을 제공 할 수있는 유연성을 원합니다. – mtanish

+0

오, 임베디드 시스템과의 연결은 전체 시간 동안 유지되어야합니까? 지금은 이해. 나는 템플릿을 제공 한 소켓 솔루션이 적절하다고 생각한다. 또한 Net :: Server 패키지를 사용하면 쉽게 텔넷을 통해 콘솔에 액세스 할 수있는 명령 서버를 사용할 수 있습니다. – Jerome

1

는 소리 다음 것 CGI 웹 데몬을 호출

use CGI; 
my $cgi = new CGI; 
if ($cgi->param('action') eq "MyFirstCommand") { 
    # perform your actions for this command and output a response to STDOUT 
} 
elsif ($cgi->param('action') eq "MySecondCommand") { 
    # perform your actions for this command and output a response to STDOUT 
} 

(테스트되지 않음) 스크립트 :

귀하의 CGI 웹 데몬은 다음과 같을 것 (다시 테스트되지 않음) 과거에

use LWP::Simple; 
my $URL = 'http://hostname:port/cgi-bin/daemon-script.cgi?action=MyFirstCommand'; 
my $http_response = LWP::Simple::get($URL); 
# analyze the response for success or failure 
1

, 내가 이런 일을 할 필요가 한 때, 나는 일반적으로 처리했습니다 패션의 이러한 종류의 데몬을 호출 할 URL을 구성

1) 즉시 응답을 사용자에게 즉시 보내야하는 경우 (여기서는 나타나는 것처럼), 소켓을 사용하여 데몬과 통신하는 것은 다음과 같습니다. 잘 했어. 공유 메모리, 파이프 및 기타 등등 다른 옵션이 있지만 소켓을 사용하면 프런트 엔드 웹 서버와 백 엔드 데몬을 별도의 시스템으로 분리해야하는 경우 쉽게 확장 할 수 있습니다.

2) 응답 시간이 중요하지 않은 경우 들어오는 명령을 데이터베이스 테이블에 저장된 대기열로 밀어 넣은 다음 데몬이 정기적으로 대기열을 폴링하여 새 작업을 확인해야했습니다. 이것은 구현하기가 조금 더 쉬우 며 소켓 기반 옵션보다 더 잘 확장됩니다. 단, 데이터베이스를 통한 모든 통신의 제한 사항을 처리 할 수 ​​있어야합니다.

+0

응답의 중요하지만, 업데이트 된 값이 필요 통계 카운터 또는 CPU 말할 수 슈퍼 때가 아니다 지속적으로 표시 할 수 있습니다. 소켓은 실행 가능한 옵션 인 것 같습니다. 감사합니다 – mtanish

관련 문제