Catalyst-Runtime-5.7007。
catalyst.pl project直後のproject::Controller::Rootの
sub default : Private { my ( $self, $c ) = @_; # Hello World $c->response->body( $c->welcome_message ); }
を以下のように変えて
sub default : Private { my ( $self, $c ) = @_; system("ls"); if ($? == -1) { warn "failed to execute: $!\n"; } elsif ($? & 127) { warn "child died with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without'; } else { warn "child exited with value %d\n", $? >> 8; } # Hello World $c->response->body( $c->welcome_message ); }
のようにsystem()を使うと
failed to execute: No child processes
と言われる。
sendmailを呼びだすようなMIME::Lite::TT::HTML::Japaneseなどを
使っても刺さる。
どうやらこの症状は起動しているサーバーによって挙動が違い
付属のテストサーバーでは、上の通り「No child processes」。
付属のテストサーバーに-rオプションを付けると、system()でロックする。
lighttpdだと、問題なし。
臭ったところのCatalyst::Engine以下ですが、
Catalyst::Engine::HTTPにlocal $SIG{CHLD} = 'IGNORE';を発見。
これが原因になってたよう。
なので、テストサーバ、リスタート付きテストサーバ、lighttpdの三種で
互換性のあるコードを書くには
{ $SIG{CHLD} = 'DEFAULT'; system("/bin/ls"); .... }
などとしなくては、ならないのかにゃ。
なんか心地好くない気がするけど、とりあえず解決。