У меня есть скрипт 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++ сообщает, что сценарий успешно завершен, что означает, что статус выхода .
Существует еще одна возможность. Если у вас есть блок END {...}, он может изменить код выхода. Вы ? – cdarke
Нет, у меня нет такого блока. Кроме того, даже если бы это было так, это было бы вызвано для случая, когда есть дополнительная «печать» между двумя последними строками. –
ОК, это был единственный случай, о котором я могу думать, когда изменяется код выхода. Вы делаете несколько предположений о том, что 'exit' не вызывается. Я думаю, что более точно симптомы следует описывать как «код возврата изменен». Я бы заподозрил, как вы обнаруживаете код возврата в вызывающем. – cdarke