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';
を実行します。
ファイルを頻繁に変更すると、リソースを使い尽くしやすくなり、ユースケースによってはDOS攻撃のベクターになります。これらのイベントは、cpanのイベントループの1つで処理する必要があります。 AnyEventを見るのが良い出発点です。 –
fork()が失敗していますか? 'die'や' warn'のようなエラーメッセージが表示されますが、表示されたコードはforkが失敗した場合(つまり$ pidが未定義の場合)、その出力を生成しません。 – pilcrow
はい、メッセージのこの部分から来ました: if(!$ pid){print "[ERROR]"、$ !; } –