2013-03-15 1 views
0

원격 호스트 설정을위한 펄 스크립트가 있습니다. 그리고 이것은 뭔가 잘못 될 경우를 대비 한 인터럽트 처리기입니다.exit가 항상 펄에서 호출되지 않는 이유는 무엇입니까?

sub interrupt 
{ 
    $SIG{'__DIE__'} = ''; 
    my $signal = shift; 
    print STDERR "Error $SELF_NAME: Bootstrapping of host '$REMOTE_HOST' is interrupted with error '$signal', deleting remote temporary directory $REMOTE_TEMP_DIR.\n"; 
    remote_exec("perl -e \"use File::Path; rmtree('$REMOTE_TEMP_DIR');\"", $REMOTE_HOST, $REMOTE_EXEC_METHOD, $REMOTE_EXEC_PORT, $USERNAME, $PASSWORD, 0, 1); 
    exit 1; 
} 

그리고이 처리기는 필요할 때 항상 호출됩니다. 따라서 부트 스트랩이 중단되었다는 오류를 STDERR에서 볼 수 있습니다. 그러나 exit 1;이 호출되지 않고 스크립트는 exit_code = 0과 함께 반환됩니다. BUT 내 처리기의 마지막 두 줄 사이에이 줄을 추가하면 print STDERR "After remote_exec and before exit";이 잘 작동합니다 (즉, exit_code = 1으로 반환 됨).

참고 : 로컬 호스트에서 테스트 중이므로 remote_execsystem($COMMAND)을 방금 호출합니다. 종료 상태 일 때 나는 그것의 표준 로그 및 검사 종료 상태를 추적 프로그램 ++ 내 C에서와 경우에 스크립트를 실행

:

UPDATE

스크립트가 호출되는 방법에 대한 세부 사항을 추가 과 같지 않습니다. 오류가 발생합니다. 그래서 exitsystem 사이에 스크립트에 여분의 줄을 추가하면 오류가 있음을 알 수 있습니다. C++ 프로그램이 출력하지만, 여분의 줄이 없다면 C++ 프로그램은 스크립트가 성공적으로 종료되었음을 알립니다. 즉, 종료 상태를 의미합니다. .

+1

다른 가능성이 있습니다. END {...} 블록이 어딘가에 있다면 종료 코드를 변경할 수 있습니다. 너? – cdarke

+0

아니요 그런 블록이 없습니다. 또한 가지고 있었다고해도 마지막 두 줄 사이에 여분의 '인쇄'가있는 경우에도 호출 될 것입니다. –

+0

그래, 그게 종료 코드가 바뀔 때 내가 생각할 수있는 유일한 기회 였어. 'exit'가 호출되지 않는다는 것에 대해 약간의 가정을하고 있습니다. 나는 좀 더 정확하게 말하면 증상은 "리턴 코드가 바뀌었다"고 기술되어야한다고 생각한다. 나는 당신이 호출자의 반환 코드를 감지하는 방법을 의심합니다. – cdarke

답변

0

실제로 문제를 설명하지 않았으므로이를 설명하는 방법을 추측해야하고 실패했습니다.

$ perl -e' 
    sub interrupt { 
     $SIG{"__DIE__"} = ""; 
     my $signal = shift; 
     print STDERR "...\n"; 
     system("echo ..."); 
     exit 4; 
    } 
    $SIG{INT} = \&interrupt; 
    <>; 
' 
^C... 
... 

$ echo $? 
4 

"라고하지"에 의해

당신도 무엇을 의미합니까 (이 1보다 더 차별화의 원인 (4)를 사용)? 인터럽트의 결과로 프로그램이 종료되었다는 것을 나타내는 것처럼 보입니다. 이는 호출 된 것을 의미합니다.

+0

죄송합니다. 답변을 얻지 못했습니다. 표준 로그를 추적하고 종료 상태를 확인하는 내 C++ 프로그램에서 스크립트를 실행하고 종료 상태 인 경우! = 0은 오류를 인쇄합니다. 그래서'exit'와'system' 사이에 스크립트에서 여분의 줄을 추가하면 C++ 프로그램이 출력하는 에러를 볼 수 있습니다. 그러나 C++ 프로그램은 여분의 줄이 없다면 exit_status를 의미하는 스크립트가 성공적으로 종료되었다고 알려줍니다. == 0 –

+0

귀하의 문제에 대한 시연을 요청했습니다. 지금 당장은 불특정 상황에서 Perl 버그에 대한 검증 할 수없는 주장이 있습니다. – ikegami

+0

그러면 누군가가 이미 대답 한 질문을 보게되면 다른 대답을 주려고 열지 않을 것입니다. :) –

관련 문제