nginx+fcgiwrap+Mojolicious::Liteでforkして、親プロセスは終了させて子プロセスで処理を続行させていたのですが、どうも親プロセスが終了してくれないように見えたので色々試していました。
(FastCGIだからこうなのかもしれないし、morboとかhypnotoadだと変わってくるかもしれないです。)
Apache+CGIの時に使ってた処理
my $pid = fork();
die "fork fault: $!" unless defined $pid;
if($pid){
# 親プロセス
}
else{
close(STDOUT);
close(STDIN);
close(STDERR);
# 子プロセス
}
今回の処理
use POSIX 'setsid';
my $pid = fork();
die "fork fault: $!" unless defined $pid;
if($pid){
# 親プロセス
}
else{
setsid;
open (STDIN, "</dev/null");
open (STDOUT, ">/dev/null");
open (STDERR, ">&STDOUT");
# 子プロセス
}
設定色々いじってスクリプトとか使えなくなることが多かったのですが、ようやく移行が終わったのでしばらくは放置でいいかなと思います。(→死亡フラグ)
めんどくさいので本番環境をぶっつけでいじりまくったのですが、ログ見てたらupicoとかlistとか処理途中なのに容赦なくサーバ止めまくってたので申し訳なかったです。(※あんまり反省してない)