Обстоятельства, при которых die () не выходит из скрипта Perl? - PullRequest
6 голосов
/ 14 июля 2011

Я отлаживаю действительно странную проблему с долго работающим Perl-скриптом.

Проблема в том, что скрипт не завершается на die(), как ожидалось. Вместо этого скрипт просто зависает, не возвращаясь.

Я не определял обработчики ошибок самостоятельно, поэтому я предполагаю, что die() приведет к немедленному завершению сценария.

Это базовая структура скрипта и используемых модулей:

#!/usr/bin/perl

use strict;
use utf8;
use warnings;

use DBI; # with MySQL driver ("dbi:mysql:database=...")
use Geo::IP;
use POSIX;
use URI::Escape;

open(COMMAND, 'command_line |');
while (<COMMAND>) {
    #
    # .. stuff that can go wrong ..
    #
    die("I'm expecting the script to terminate here. It doesn't.") if ($gone_wrong);
}
close(COMMAND);

Что может быть объяснением этого поведения? Известен ли какой-либо из используемых модулей для установки обработчиков ошибок, которые могли бы объяснить зависание скрипта на die()?

1 Ответ

4 голосов
/ 14 июля 2011

Ну, END блоки и деструкторы объектов по-прежнему вызываются после die.Если один из этих зависаний (или делает что-то, что занимает много времени), сценарий не завершится немедленно.Но это должно произойти после печати сообщения из die (если только STDERR не буферизирован, поэтому вы не видите сообщение сразу).

Вы упомянули DBI, поэтому у вас, вероятно, есть база данныхобрабатывать, чей деструктор вызывается.(Хотя я не уверен, что это проблема.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...