원격 호스트 설정을위한 펄 스크립트가 있습니다. 그리고 이것은 뭔가 잘못 될 경우를 대비 한 인터럽트 처리기입니다.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_exec
은 system($COMMAND)
을 방금 호출합니다. 종료 상태 일 때 나는 그것의 표준 로그 및 검사 종료 상태를 추적 프로그램 ++ 내 C에서와 경우에 스크립트를 실행
:
UPDATE
스크립트가 호출되는 방법에 대한 세부 사항을 추가 과 같지 않습니다. 오류가 발생합니다. 그래서 exit
과 system
사이에 스크립트에 여분의 줄을 추가하면 오류가 있음을 알 수 있습니다. C++ 프로그램이 출력하지만, 여분의 줄이 없다면 C++ 프로그램은 스크립트가 성공적으로 종료되었음을 알립니다. 즉, 종료 상태를 의미합니다. .
다른 가능성이 있습니다. END {...} 블록이 어딘가에 있다면 종료 코드를 변경할 수 있습니다. 너? – cdarke
아니요 그런 블록이 없습니다. 또한 가지고 있었다고해도 마지막 두 줄 사이에 여분의 '인쇄'가있는 경우에도 호출 될 것입니다. –
그래, 그게 종료 코드가 바뀔 때 내가 생각할 수있는 유일한 기회 였어. 'exit'가 호출되지 않는다는 것에 대해 약간의 가정을하고 있습니다. 나는 좀 더 정확하게 말하면 증상은 "리턴 코드가 바뀌었다"고 기술되어야한다고 생각한다. 나는 당신이 호출자의 반환 코드를 감지하는 방법을 의심합니다. – cdarke