Тайм-аут gethostbyname
очень и очень длинный. Я предполагаю, что вы убьете программу, прежде чем увидите, что она просто занимает много времени. Кажется, вам действительно нужно сократить время ожидания.†
Вы можете настроить собственный таймер с помощью будильника. Когда он отключается, процессу доставляется сигнал SIGALRM, который по умолчанию завершает его. Итак, мы настроили обработчик для этого сигнала, в котором выдается die
, тем самым превратив его в исключение. Это eval
-ed, и мы возвращаем себе управление.
eval {
local $SIG{ALRM} = sub { die "Timed out" };
alarm 5; # or what you find most suitable
# your code that may need a timeout
alarm 0;
};
if ($@ and $@ !~ /Timed out/) { die } # re-raise if it was something else
if ($@ and $@ =~ /Timed out/) { # test
print "We timed out\n";
}
Если ваш код завершается менее чем за 5
секунд, мы получаем alarm 0;
, что отменяет предыдущую тревогу и программа продолжается. В противном случае SIGALRM
испускается, но обрабатывается и превращается в die
, который является eval
-ed, и поэтому весь сигнал перехватывается, и управление падает сразу после блока. Мы проверяем, действительно ли die
было вызвано нашей тревогой, и если нет, мы повторно поднимаем его.
Также см. эту публикацию, чтобы получить дополнительные комментарии, и, пожалуйста, найдите дополнительные.
† Функциональность Timeout
, существующая в модуле IO::Socket
, предназначена для подключения, а не для поиска DNS, который здесь является виновником. Спасибо Штеффену Ульриху за комментарий.
14.06.2017