2009-08-16 4 views
3

나는 내 테스트 코드가 어떤 것인지 Proc::Daemon를 사용하기 전에 몇 가지 테스트 코드를 작성 :Proc :: Daemon 사용 중에 내 프로그램이 파일에 쓰지 않는 이유는 무엇입니까?

나는 장난감 데몬을 시작하면
#! /usr/bin/perl 

use strict; 
use warnings; 
use Proc::Daemon; 

Proc::Daemon::Init(); 
my $continue = 1; 
$SIG{TERM} = sub { $continue = 0 ; } 

while ($continue) { 
    sleep(5) ; 
    &greeting ; 
} 

sub greeting { 
    open (FH, ">>/home/daogu/foo") or die "can't open it" ; 
    print FH "hello word\n" ; 
    close FH ; 
} 

, 나는 실제로 "foo"에 기록되어 아무것도 찾을 수 없습니다. 아무도 이것이 왜 일어나는 지 설명 할 수 있습니까? 감사.

+2

분명히 $ 계속 데몬 줄에서 닫힌 파일 핸들의 $의 FH에 데몬 라인 (21) 인쇄()에서 거부 권한은 언젠가 당신이 "잠 5"에서 깨어나 전에 0으로 간다. 일부 기본적인 디버깅은 아마 당신이 무슨 일이 일어나고 있는지 이해하는데 도움이 될 것이며 아마도 웹 사이트에 붙여 넣기보다는 시간을 단축했을 것입니다. – jrockway

+0

줄 9의 끝에 세미콜론을 쓰길 원합니다 :'$ SIG {TERM} = sub {$ continue = 0; };'이건 오타 일 수도 있고 근본적인 문제라고 생각하지 않습니다. – Telemachus

+0

은'open()'의 3 개의 인수 형식을 사용합니다. –

답변

7

, 당신은 9 행에 할당을 종료 세미콜론이 필요 스크립트와 여기에 그것을 놓쳤습니다.

그 이상으로, 나는 Guss가 옳다고 의심하고 허가 문제가 있습니다. 확인 방법이 있습니다. 별도의 터미널을 열고 top을 실행하십시오. 데몬 스크립트를 시작하면 Perl 프로세스가 표시됩니다. 문제가 허가라면 Perl 프로세스가 사라지는 것을 빨리 알 수 있습니다. 스크립트는 서브 루틴에서 종료되지만 데몬은 그 시점에서 터미널에 액세스 할 수 없으므로 유용한 오류 메시지에 대한 시도는 표시되지 않습니다.

이 테스트를 신속하게 변경하려면 서브 루틴에서 die ~ 으로 변경하십시오. 그렇게하면 데몬은 영원히 계속 실행됩니다 (이를 확인하기 위해 터미널 실행을 top으로 확인하십시오). 그러나 문제가 허가 인 경우 은 여전히 ​​에 생성되거나 기록 된 파일을 볼 수 없습니다.

편집 : 그래, 권한 문제 + STDERR에 대한 액세스 권한 = 죽은, 자동 데몬. 이 버전을 시도하지만, 확인 당신 수는 STDERR에 대한의 스위치 로그에 쓰기 :

수 : 당신은 당신의 로그에이 한꺼번에 많이 볼 가능성이

Proc::Daemon::Init(); 
my $continue = 1; 
$SIG{TERM} = sub { $continue = 0 ; }; 

while ($continue) { 
    sleep(5); 
    greeting(); 
} 

sub greeting { 
    open STDERR, '>>', '/Users/telemachus/log' 
     or die "Can't reopen STDERR to log: $!"; 
    open my $fh, '>>', '/usr/local/foo' 
     or warn "Can't open /usr/local/foo for writing: $!"; 
    print $fh "hello word\n"; 
    close $fh; 
} 

쓰기 '가 t 개방 foo는 : 22

+0

나는 항상 strace (1)가 원본 코드를 변경하지 않고 이러한 상황을 추적하는 데 큰 도움이된다는 것을 발견했습니다. –

+0

@Dominic : "원본 코드를 변경하지 않고"나에게 매우 유혹을주는 것처럼 들리지만, 나는 당신에게 거짓말을 할 수 없습니다. 내 인생을 살리기 위해'strace' (또는 맥에서 찾아 다니는 다른 누군가를위한'dtrace'와'dtruss')의 출력을 해독 할 수 없었습니다. 나는 방법을 정말로 배워야한다. – Telemachus

3

스크립트가 정상적으로 보입니다. 대부분의 경우 문제는 파일 권한 일뿐입니다. 파일을 만들 디렉토리에 대한 쓰기 권한이 있는지 또는 파일 자체에 대한 쓰기 권한이있는 파일이 이미 있는지 확인하십시오.

내 컴퓨터에서 스크립트를 실행해도 정상적으로 작동합니다. 나는 당신의 프로그램도 실행되지 않을 것이다, 그래서 당신을 추측하고있어,라고 덧붙였다까지

$SIG{TERM} = sub { $continue = 0 ; }; 

가 그에있다 : 첫째

+1

정말요? 9 번 줄에 누락 된 세미콜론이 있더라도? 나의 실험은 이것을 주었다.'daemon 11 번 라인에서 문법 오류가 발생했다. ') { "'and on and on. – Telemachus

+0

그래, 당연히 나는 그것을 고쳐 썼다. 컴파일러가 문제를 즉시 알리는 것이 중요하다고 생각하지 않았다. – Guss

+1

충분히 공정하고, 나는 그것을 위해 당신을 downvote하지 않았다. 그러나, 당신은 그의 프로그램이 컴파일되지 않기 때문에 나에게 이상한 "당신의 스크립트가 나에게 잘 어울린다"고 말한다. Perl은 당신에게 "나는 침대를 적셨습니다"라고 말하지만 정확히 어디를 말하지 않습니다. (쉽게 찾을 수 있지만 컴파일러는 "9 행의 익명 서브 루틴 끝에 세미콜론이 필요하다"라고 말하지는 않습니다.) 더 큰 문제는 다음과 같은 세미콜론에서 벗어나는 것입니다. 익명의 잠수함은 Perl에서 꽤 흔히 볼 수있는 잡동사니입니다. 그래서 언급할만한 가치가 있다고 생각합니다. 컴파일러가 암시하는 문제는 세미콜론이 필요하다는 것을 알면 쉽게 발견 할 수 있습니다. – Telemachus

관련 문제