2013-03-15 2 views
0

У меня есть скрипт perl для настройки удаленного хоста. И это его обработчик прерывания в случае, если что-то пойдет не так:Почему выход не всегда вызывается в perl?

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) внутри, поскольку я тестирую его на локальном хосте.

UPDATE

Добавление некоторые подробности о том, как скрипт вызывается:

я запустить скрипт из моего C++ программы, которая отслеживает его стандартные журналы и проверяет состояние выхода и в случае, когда статус выхода не равный это принт погрешность. Итак, когда я добавляю дополнительную строку в свой сценарий между exit и system, я вижу ошибку, которую выводит моя программа на 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 

(Б 4 потому что это более своеобразны, чем 1.)

Что вы еще подразумеваете под "не называют"? Кажется, вы указали, что программа вышла из-за прерывания, что означает, что она вызвана.

+0

Извините, я не получил вашего ответа. Я запускаю скрипт из своей программы на C++, которая отслеживает его стандартные журналы и проверяет статус выхода, а в случае, когда статус выхода! = 0, он печатает некоторую ошибку. Поэтому, когда я добавляю дополнительную строку в свой сценарий между 'exit' и' system', я вижу ошибку, которую выводит моя программа на C++, но если такой дополнительной строки нет, программа C++ сообщает, что сценарий успешно завершен, что означает exit_status == 0 –

+0

Я попросил демонстрацию вашей проблемы. Прямо сейчас, все, что у нас есть, - это непроверяемые утверждения об ошибке в Perl в неустановленных обстоятельствах. – ikegami

+0

Тогда было бы лучше, если бы вы написали комментарий вместо ответа, потому что, если кто-то увидит вопрос, на который уже ответили, он/она, скорее всего, не откроет его для ответа на другой вопрос :) –

Смежные вопросы