Perl スクリプトを使用して、system() で呼び出される反復操作をバッチ処理したいと考えています。何か問題が発生してこのスクリプトを中断したい場合は、^C がシェルによってキャプチャされ、すべてのジョブが停止し、Perl スクリプトは次のジョブに進みます。
割り込みが Perl スクリプトを停止するようにジョブを呼び出す方法はありますか?
Perl スクリプトを使用して、system() で呼び出される反復操作をバッチ処理したいと考えています。何か問題が発生してこのスクリプトを中断したい場合は、^C がシェルによってキャプチャされ、すべてのジョブが停止し、Perl スクリプトは次のジョブに進みます。
割り込みが Perl スクリプトを停止するようにジョブを呼び出す方法はありますか?
$?
システムによって実行されたコマンドがシグナル 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 システム。perldoc perlvarの詳細については、$?
system()
$?
の戻り値をチェックしていませんsystem
。親プログラムに追加します。
use autodie qw(:all);
そして、プログラムは期待どおりに中止されます:
"…" died to signal "INT" (2) at … line …
自分でクリーンアップするか、別のメッセージを使用するために、 Try::Tinyでこの例外をキャッチできます。