RailsのFastCGI運営時でのrestert,reloadの方法
RailsのFastCGIで動かしてるアプリケーションのconfig(enviroment.rb)やライブラリの再読込って最初やり方が解らずに、lighttpdを毎回毎回毎回再起動というアホらしいことをしていたんだけど、先日RailsFCGIHandlerのソースを見たら特定のSIGNALを送ればいいことが解った。ソースには
SIGNALS = { 'HUP' => :reload, 'TERM' => :exit, 'USR1' => :exit, 'USR2' => :restart }
と定義されてるている。reloadとrestartの一番の違いはreloadだとライブラリなどの再読込はされるけど、enviroment.rbは再読込されず、restartは両方再読込されることだろう。で、コレを知ってからはアプリケーションがwikiならばwikiがpathに含まれているので
$ for i in `ps axo 'pid command'|grep dispatch.fcgi|grep wiki|awk '{print $1}'`;do kill -USR2 $i;done
みたいにコマンドを実行してSIGNALを実行してた。でも最近のRailsに付属の./script/process/reaper を使うと
$ ./script/process/reaper -a {restart|reload|graceful|kill}
で一発でできて便利!だけどこいつに罠があって、今のところsymlink先をFastCGIで動かしていると、File.expand_pathでdispatch.fcgiのフルパスを取得するためうまく動かないと云う、、、。でもたぶんそのうち誰かがパッチ投げてくれるから待てば直るはずだyp!
もちろんRails 0.13.1には./script/process/reaperは入ってないけどもうすぐ1.0が出るだろうつーことで。