를 작성하지 않습니다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>
아마도'fileno (STDOUT)'이 2 (etc)라고 가정하고 그렇지 않거나 지나치게 특별하다. – ikegami
나는 이것이 좋은 가설이라고 생각하지만, Proc :: Daemon 페이지에서 두 번째 자식은 열려있는 파일 설명자를 모두 닫습니다 (dont_close_fh 및/또는 dont_close_fd를 정의하지 않는 한). 두 번째 자식은 STDIN, STDOUT 및 STDERR을 생성자 (new)에 정의 된 위치로 엽니 다. 그래서 모든 파일 기술자를 닫은 다음 새로운 파일 기술자를 여는 것으로되어 있습니다. 어쩌면 mod_perl이 STDIN/STDOUT의 전역 상수를 어떻게 변경합니까 ?? – Severun
나는 그것이 말한 것의 모순으로 생각하지 않을 것이다. 특히 fd 2가 아닌 STDOUT의 관점에서 이야기하기 때문에 그렇다. – ikegami