起動スクリプトを使ってPlack::Server::FCGIを起動させると困った事に。。。

現在Plack::Server::FCGIを使ってアプリを起動させるとプロセスマネージャのプロセス名が全て"perl-fcgi-pm"になる。 別に名前がどうのと言う訳では無いのだが困った事がある。

それはFreeBSDだけの問題なのかも知れないがrcNG駆動でプロセスを止めるにはプロセス名を指定しないと止まってくれません。 MyApp1もMyApp2も全て同じ名前になってしまう為個別にrc.dスクリプトを使ってアプリケーションを止める事ができず全てのFCGIプロセスが止まってしまいます。

pidfile見とけよと言われそうですがなんとかならんだろうか?

で、プロセスマネージャの名前を指定して起動できないか調べてみた。

FCGI::ProcManagerのソースを読むとインスタンスをnewする際にpm_titleを指定すればいいのは直ぐ分かった。

なのでPlack::Server::FCGI側でnewする時にpm_titleを渡すとFCGI::ProcManagerにpm_titleが渡るようにパッチを書いてみた。

patch

*** orig/FCGI.pm    2009-11-17 01:53:40.000000000 +0900
--- FCGI.pm 2009-11-17 02:00:35.000000000 +0900
***************
*** 59,64 ****
--- 59,65 ----
              $proc_manager = $self->{manager}->new({
                  n_processes => $self->{nproc},
                  pid_fname   => $self->{pidfile},
+                 pm_title    => $self->{pm_title}||'perl-fcgi-pm',
              });

              # detach *before* the ProcManager inits

このパッチを当てるとPlack::Server::FCGIをnewする際にpm_titleを指定出来るようになります。

my $server = Plack::Server::FCGI->new(
            nproc  => 1,
      listen => "/tmp/myapp-dispatch.sock",
      pidfile=> "/tmp/myapp-dispatch.pid",
      detach => 1,
      pm_title => "myapp_plack_server_fcgi",
);

こんな感じでアプリ毎に名前が入った方がカッコよくね! もっともプロセスマネージャにFCGI::ProcManagerを使った時だけで別のマネージャの場合は動かなくなるかもしれません。><

ちなみにこの時のrc.dスクリプトはコチラ

/usr/local/etc/rc.d/myapp_dispatch

#!/bin/sh
# MyApp_Dispatch.sh
# $Id: myapp_dispatch 100 2009-11-16 02:58:47Z reed $
#
. /etc/rc.subr

name="myapp_dispatch"
rcvar=`set_rcvar`

load_rc_config ${name}

: ${myapp_dispatch_enable="NO"}
: ${myapp_dispatch_bin_path="/path/to/myapp.fcgi"}
: ${myapp_dispatch_user="www"}
: ${myapp_dispatch_group="www"}
: ${myapp_dispatch_pidfile="/tmp/myapp-dispatch.pid"}

pidfile="${myapp_dispatch_pidfile}"
procname="myapp_plack_server_fcgi"
command="${myapp_dispatch_bin_path}"
command_args=""

start_precmd=start_precmd
stop_postcmd=stop_postcmd

start_precmd()
{
}

stop_postcmd()
{
        rm -f ${pidfile}
}

run_rc_command "$1"

この起動スクリプトを置いてrc.confに以下を追加するとサーバー起動時に自動でアプリが起動します。

アプリ毎に /usr/local/etc/rc.d/myapp_dispatch restart とかが個別に出来るようになります。

/etc/rc.conf

myapp_dispatch_enable="YES"
created:

Back to top