2009-03-19 6 views
2

私はPerlのCGI::Fastを使って動作するアプリケーションを持っています。CGI :: Fastベースのアプリケーションをkill -HUPに対応させる方法を教えてください。

は、基本的には、コードのメインループは次のとおりです。

​​

は今、私はそれを殺す能力を追加したかったが、現在処理要求を中断することなく。そうするために、私はSIGHUPに処理を追加しました。もっとまたは線に沿って以下:

my $sighupped = 0; 
$SIG{ 'HUP' } = sub { $sighupped = 1; }; 
while (my $cgi = CGI::Fast->new()) { 
    do_whatever($cgi); 
    exit if $sighupped; 
} 

それは「それはユーザの要求を処理しながら、プロセスを乱さない」ことになるとは本当に素晴らしい作品。しかし、プロセスが新しい要求を待っている場合、sighupベースの終了は、最終的に要求を取得して処理するまで実行されません。

この問題を回避する方法はありますか?要求を待っている間にHUP(または他のシグナル、変更可能)が到達すると、スクリプトを即座に終了させるために何を達成したいのですか?

答えて

1

あなたはFast::CGIにタイムアウトを追加するeval機能のブロックバージョンとalarm機能を使用することができます。下のコードで私は5秒のタイムアウトを設定しました。タイムアウトすると、ループの先頭に戻り、$continueがゼロに設定されているかどうかを確認します。それがなければ新しいCGI::Fastオブジェクトを開始します。これは、HUPを送信してから新しいCGI::Fastオブジェクト(タイムアウトがループの残りの部分に影響を与えない)を待っていた場合にコードが停止し始める前に、最大5秒かかることを意味します。

my $continue = 1; 
$SIG{HUP} = sub { $continue = 0 }; 
while ($continue) { 
    my $cgi; 
    eval { 
     local $SIG{ALRM} = sub { die "timeout\n" }; 
     alarm 5; #set an alarm for five seconds 
     $cgi = CGI::Fast->new; 
     alarm 0; #turn alarm off 
    }; 
    if ([email protected]) { 
     next if [email protected] eq "timeout\n"; #we will see the HUP signal's change now 
     #died for a reason other than a timeout, so raise the error 
     die [email protected]; 
    } 
    last unless defined $cgi; #CGI::Fast has asked us to exit 
    do_stuff($cgi); 
} 

#clean up 
1

ハンドラがどこにあるかに基づいてSIGnalsを再宣言できます。

fast-cgi whileループの内側またはfast-cgiポーリングの内側にいるため、 にない場合は、イベントループが終了します(基本的にはデフォルト)。イベントループロジックの内部にいる場合、ロジックが終了して終了するのを待ちます。

私は現時点では編集者がいません。

$inlogic=0; 
$hupreq=0; 
SIG{SIGHUP}={ exit unless($inlogic); $hupreq=1;} 

while() 
{ 
    $inlogic=1; 
    function(); 
    $inlogic=0; 
    exit if($hupreq); 
} 
関連する問題