2012-03-22 27 views
2

Inotify2を使用して着信ファイルのディレクトリを監視するPerlでデーモンプロセスを作成しました。各ファイルが到着すると、デーモンは子プロセスをforkします。フォークの結果(あるperlのファイルシステムイベントの子プロセスをforkする

Cannot allocate memory at notifyd.pl line ... 

):今、私が私のログファイルにこのエラーを得たので、あまりにも多くのファイルは、同じ時間(それゆえ、あまりにも多くのフォーク)に到着しているようです。私はプロセスをフォークしないことによって、イベントを欠場する余裕がない

sub watcher { 
     my $e = shift; 
     my $pid = fork(); 
     if(!defined $pid) { 
      print "[ERROR]", $!; 
     } 
     elsif($pid == 0) { 
      my @args = ($e->fullname, $e->mask); 
      exec($childprocess, @args) or die($!); 
     } 
} 

:フォーク、その後EXECVをやっ

my $inotify = new Linux::Inotify2() or die($!); 

    foreach my $k (@PATHS) { 
     $inotify->watch($k, 
IN_MOVE_SELF|IN_DELETE_SELF|IN_CLOSE_WRITE, \&watcher) or die($!); 
    } 

    $inotify->blocking(1) or die($!); 

    for(;;) { 
     $inotify->poll() or die($!); 
    } 

ウォッチャー機能付:

は基本的に私は、次のコードを持っています。

私はこれを改善してフォークが失敗しないようにする方法を提案していますか?


編集:デーモンがSIGCHLDに応答しなかったため、子プロセスが終了するとゾンビになったようです。だから、多くのゾンビの子プロセスがfork()が失敗した理由かもしれません。デーモンは現在フォーク前に$SIG{CHLD} = 'IGNORE';を実行します。

+1

ファイルを頻繁に変更すると、リソースを使い尽くしやすくなり、ユースケースによってはDOS攻撃のベクターになります。これらのイベントは、cpanのイベントループの1つで処理する必要があります。 AnyEventを見るのが良い出発点です。 –

+0

fork()が失敗していますか? 'die'や' warn'のようなエラーメッセージが表示されますが、表示されたコードはforkが失敗した場合(つまり$ pidが未定義の場合)、その出力を生成しません。 – pilcrow

+0

はい、メッセージのこの部分から来ました: if(!$ pid){print "[ERROR]"、$ !; } –

答えて

2

インダイレクションの別のレイヤーを追加して問題を解決します。

イベントを受け取ったら、job queueにファイル名を入力します。リソースが妥当でない場合、キューはファイルを処理する新しいジョブを開始します。このスキームは、イベントが最終的に行動することを保証します。

+0

ありがとう、私はそれを実装する可能な方法を調べる必要があります。問題は、キューを処理するための別のプロセスを実際には持たないということです。 –

2

使用Forks::Super

このセットアップのような、より強固なバックグラウンド・プロセス・マネージャは、例えば、一度に実行されている最大10本のフォークを持っています。 10個のフォークがすべてビジー状態になると、新しい要求がキューに入れられます。他のバックグラウンド・プロセスが完了し、リソースが使用可能になると、キュー内のジョブが実行されます。

use Forks::Super MAX_PROC => 10, ON_BUSY => 'queue'; 

... 

sub watcher { 
    my $e = shift; 
    fork { 
     sub => sub { 
      my @args = ($e->fullname, $e->mask); 
      exec($childprocess, @args) or die($!); 
     } 
    }; 
} 
+0

ありがとうございます。それは私がそのモジュールをインストールすることができないかもしれないことを除いて、よく見えるので、私は自分で同様のものを実装しなければならないでしょう。 –

関連する問題