2016-09-08 2 views
0
내가 thusly 히 mod_perl을 스크립트에 발동 :: 데몬을 사용하고있다

를 작성하지 않습니다PROC : 데몬은 STDOUT 또는 STDERR

$의 BINDIR은 $의 ddir에 $ JID는 고유 당 실행/로그 파일 위치 및입니다된다 프로세스 식별자 (여러 프로세스가 동일한 파일을 열지 않도록) $ cmd는 임의의 perl 스크립트 및 인수로로드됩니다.

my $daemon = Proc::Daemon->new (
      work_dir  => $bindir, 
      child_STDOUT => $ddir.'/'.$jid.'_stdout.log', 
      child_STDERR => $ddir.'/'.$jid.'_stderr.log', 
      pid_file  => $ddir.'/'.$jid.'_pid.txt', 
      exec_command => $cmd, 
    ); 

    my $pid = $daemon->Init(); 

위의 코드는 cgi-script (mod_perl 없음)와 함께 Apache를 사용할 때 유용합니다. "$ cmd"프로세스에서 STDERR 로그를 인쇄하여 위의 정의 된 로그 파일에 인쇄하십시오.

Apache2를 사용하여 Ubuntu Linux 14.04 LTS에서 mod_perl2를 사용하여 위의 코드를 실행하면 pid 파일에 PID가 기록되고 위의 로그 파일이 만들어 지지만 로그 파일에 아무것도 기록되지 않습니다. $ cmd 내에서 새 파일 설명자를 열어서 쓸 수 있지만 mod_perl에서는 child_STDOUT 및 child_STDERR 파일로 출력을 보내지 않습니다.

나는 정말 명백한 것이 빠져 있다고 생각합니다. 다른 사람이 전에 본적이 있고, mod_perl에서 작동하도록하기 위해 제안 사항이 있습니다. 아파치

이 내가 일을 감아 무엇을 작동하지 않았다 많은 솔루션이 있었다 OK 있도록
<Files "*.pl"> 
      # SetHandler cgi-script # It works if I use cgi-script 
      SetHandler perl-script 
      PerlOptions -SetupEnv # Tried with and without this 
      # PerlHandler ModPerl::RegistryPrefork # Using this made no difference 
      PerlHandler ModPerl::Registry 

    </Files> 
+0

아마도'fileno (STDOUT)'이 2 (etc)라고 가정하고 그렇지 않거나 지나치게 특별하다. – ikegami

+0

나는 이것이 좋은 가설이라고 생각하지만, Proc :: Daemon 페이지에서 두 번째 자식은 열려있는 파일 설명자를 모두 닫습니다 (dont_close_fh 및/또는 dont_close_fd를 정의하지 않는 한). 두 번째 자식은 STDIN, STDOUT 및 STDERR을 생성자 (new)에 정의 된 위치로 엽니 다. 그래서 모든 파일 기술자를 닫은 다음 새로운 파일 기술자를 여는 것으로되어 있습니다. 어쩌면 mod_perl이 STDIN/STDOUT의 전역 상수를 어떻게 변경합니까 ?? – Severun

+0

나는 그것이 말한 것의 모순으로 생각하지 않을 것이다. 특히 fd 2가 아닌 STDOUT의 관점에서 이야기하기 때문에 그렇다. – ikegami

답변

0

관련 아파치 구성

을 mpm_prefork 모듈을 사용

추가 정보 . 다음은 작동하지 않았다

: 나는 다음과 PROC :: 데몬을 호출 한 메인 라인에 코드를 대체

#!/usr/bin/perl -w 

use strict; 
use warnings; 

use POSIX 'setsid'; 
use Proc::Daemon; 

my $bindir = $ARGV[0]; 
my $ddir = $ARGV[1]; 
my $jid = $ARGV[2]; 
my $cmd = $ARGV[3]; 

setsid or die "Cannot start a new session: $!"; 

my $daemon = Proc::Daemon->new (
       work_dir  => $bindir, 
       child_STDOUT => $ddir.'/'.$jid.'_stdout.log', 
       child_STDERR => $ddir.'/'.$jid.'_stderr.log', 
       pid_file  => $ddir.'/'.$jid.'_pid.txt', 
       exec_command => $cmd, 
      ); 

my $pid = $daemon->Init(); 

exit 1; 

: 나는라는 스크립트 launchjob.pl를 만들었습니다. Proc :: 데몬이 나에게 sh를 주었다 : No such file or directory error.

시스템 ('launchjob.pl', $ bindir, $ ddir, $ jid, $ cmd);

대신 예상대로 실행되는 다음과 같은 사용됩니다.

IPC :: Run3; run3 ("launchjob.pl". $ bindir. "". $ ddir. "". $ jid. "". $ cmd);

이것은 바로 수정 한 것으로 보입니다.