@kyanny's blog

My thoughts, my life. Views/opinions are my own.

シグナルハンドラの中で SIGINT とかを無効にしたい

#!/usr/bin/perl
use strict;
use warnings;
use Perl6::Say;

my $stop = 0;
$SIG{'INT'} = sub {
    $stop = 1;
    say 'sigint received';
};

while (1) {
    say 'loop start';
    sleep 3;
    exit if $stop;
    say 'loop end';
}

こんなんでできるかと思ったけど、ダメだった。 C-c 押した瞬間にプロセスが終了してしまう。 sleep 3; してる最中に INT シグナルを受け取ったら、 $stop に 1 を代入して INT シグナルそのものは無視してプログラムの実行を続けて欲しい。 3 秒待ったあとで、 $stop が真ならば終了する。 sleep 3; の部分で実際には時間のかかる処理をさせていて、中断したいんだけど今やってるジョブは完了するまで待って欲しい。

Gearman とか TheSchwartz とかのジョブキューシステムはそういうケースもカバーしてるだろうからそれを読むか・・・でも、正直そこまでオオゴトなものじゃないから、できなきゃできないでもいいか・・・。