@kyanny's blog

大作を傑作と混同するものは確かに鑑賞上の物質主義である。大作は手間賃の問題にすぎない - 芥川竜之介

シグナルハンドラの中で 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 とかのジョブキューシステムはそういうケースもカバーしてるだろうからそれを読むか・・・でも、正直そこまでオオゴトなものじゃないから、できなきゃできないでもいいか・・・。