perl вызывает прерывание оболочки ^C останавливает оболочку, а не perl

Я хочу использовать Perl-скрипт для пакетной обработки повторяющихся операций, которые вызываются с помощью system(). Когда что-то идет не так, и я хочу прервать этот скрипт, ^C перехватывается оболочкой, останавливая любое задание, и Perl-скрипт весело переходит к следующему.

Есть ли способ вызвать задание, чтобы прерывание остановило сценарий Perl?


person Ed Hyer    schedule 10.03.2011    source источник


Ответы (2)


Вы можете проверить $?, чтобы увидеть, умерла ли команда, выполняемая системой, из-за сигнала 2 (INT):

Вот полный пример разбора $?:

my $rc=system("sleep 20"); 
my $q=$?; 
if ($q == -1) { 
    print "failed to execute: $!\n"
} elsif ($? & 127) { 
    printf "child died with signal %d, %s coredump\n",  
           ($q & 127), ($q & 128) ? 'with' : 'without';
} else { 
    printf "child exited with value %d\n", $q >> 8;
}
# Output when Ctrl-C is hit: 
# child died with signal 2, without coredump

Поэтому точная проверка, которую вы хотите:

my $rc=system("sleep 20"); 
my $q=$?; 
if ($q != -1 &&  (($q & 127) == 2) && (!($? & 128))) { 
        # Drop the "$? & 128" if you want to include failures that generated coredump
    print "Child process was interrupted by Ctrl-C\n";
}

Ссылки: система perldoc для $? обработки и system() вызова; perldoc perlvar для более подробной информации о $?

person DVK    schedule 10.03.2011

Вы не проверяете возвращаемое значение system. Добавьте в родительскую программу:

use autodie qw(:all);

и программа прервется, как и ожидалось:

"…" died to signal "INT" (2) at … line …

Вы можете перехватить это исключение с помощью Try::Tiny, чтобы выполнить очистку самостоятельно или использовать другое сообщение.

person daxim    schedule 10.03.2011