AnyEvent::Fork

AnyEvent::Fork

[5] AnyEvent::Fork は、 AnyEvent 環境で子プロセス起動して Perl スクリプトを実行させるためのPerlモジュールです。

[2] AnyEvent::Fork clarification () <http://lists.schmorp.de/pipermail/anyevent/2014q1/000634.html>

[3] fork メソッドを呼び出していて、かつ子プロセス側で AnyEvent を使っていると、ゾンビが残るようです。子プロセス側で

$SIG{CHLD} = 'IGNORE';
... とすれば、回避できます。 (AnyEventSIGCHLD を上書きするのが原因らしい。)

[4] eval のコード内でエラーが起こると、子プロセスが死に、 次の操作で親プロセスが書き込みエラーで死にます。 eval の結果を親プロセスが得ることができないので次の操作を止めることができませんし、 親プロセスの書き込みエラーは AnyEvent イベントループからの呼び出しの中なので catch する方法もありません。 回避するには eval で実行するコードを Perl eval で括って死なないようにするしかありません。 (エラーは warn など死なない方法で表示するなり、 別途 run などの親子で通信できる方法で親に知らせるなりするしかありません。)