Perl получает ошибку сегментации во время тайм-аута с использованием тревоги - PullRequest
0 голосов
/ 28 сентября 2019

Я пишу на Perl впервые, и Интернет говорит мне, что я могу использовать сигнализацию, если у меня длительный SQL-запрос.Мне нужно запустить SP, который будет работать часами в Perl, и я хотел бы установить ограничение по времени.Ниже приведен последний шаг моих кодов, но я получаю ошибку сегментации , когда процесс выполняется дольше, чем мое время ожидания, в этом случае sleep (20).Журналы показывают, что он закончил печать --- 1 ---- и затем ошибка сегментации.Как я могу это исправить?

Я попытался вывести sub DelRef {} в отдельный файл .pl и прокомментировать часть $ db в третьей строке, чтобы проверить, работает ли аварийный сигнал, и он работал нормально.Я запутался, какая часть пошла не так и стала причиной ошибки сегментации.

sub DelRef {
    print "starting defRefData\n";
    $db = new Sybapi($user, $password, $server, $margin_database);
    print "entering eval\n";
    my $timeout = 10;
    eval {
            local $SIG{ALRM} = sub { die "timeout\n" };
            print "inside eval now\n";
            alarm($timeout);
            print "---1----\n";
            #sleep(5); --working fine
            sleep(20); #not working, 
            #$db->exec_sql("exec CPN_Margins..clean_up_refData_db '$XrefCode'");
            print "----2----\n";
            alarm(0);
    };
    #alarm(0);
            print "out of eval\n";
    if($@)
    {
        #die unless $@ eq "timeout\n";
        if($@ =~ "timeout\n")
        {
        warn "Timed out!\n";
        #exit 0;
        }
        else{
                print $@;
        }
    }

}

&DelRef();
print "process is done\n";
$db->close();

1 Ответ

0 голосов
/ 28 сентября 2019

Из perldoc (https://perldoc.perl.org/functions/alarm.html)-

Обычно смешивать аварийные и спящие вызовы обычно ошибка, потому что в вашей системе может быть реализован спящий режим с сигнализацией.

Если вы хотите реализовать тайм-аут, это может быть достигнуто без сна. Просто следуйте примеру, указанному в ссылке.

РЕДАКТИРОВАТЬ: Я добавил его здесь - Как установить тайм-аут для долго работающей Sybasesp в Perl

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