Max (2524) の日記

2003 年 01 月 04 日
午前 03:55

/etc/init.d/functions

作成したZopeのシャットダウンがうまく行かない。
調べた挙げ句、/etc/init.d/functions内部のkillprocファンクションが
おかしい事が判る。Mandrake 8.1では、pidofprocファンクションで、
シャットダウンしたいサーバプロセスのPIDを探しに行くが、
Mandrake 9.0ではpidofprocファンクションは使わず、なぜかpidofproc
ファンクションとよく似た処理をわざわざ別にコードを書いてやっている。

原因はよく解らないが、とりあえず/etc/init.d/functionsの、
killproc内部でpidofprocを呼び出すように下記コードを追加した。

                if [ -z "$pid" ]; then
                                pid=`pidofproc $base`
                fi

****
ようやく原因わかる。

/etc/init.d/zopeは内部でpidofprocファンクションを再定義していた。
これはzserverの動いているプロセスID(PID)を適切に処理するため。
で、Mandrake 8.1ではkillprocファンクションが内部でpidofprocを呼び
出しているため、再定義されたzopeスクリプト内のpidofprocが呼ばれる
というわけ。ところが、Mandrake9.0ではそうなっていない。

そして、内部でdaemon zserverとして、処理プロセスを起動するが、
zserverとして動的に呼ばれるz2.pyは通常のサーバプロセスのように
/var/run以下にpidファイルを作らず、/var/zope/var以下にZ2.pidという
ファイルをつくって、そこに起動したzserverのpidを格納する。
故にpidofprocを独自に作成する必要があった。
なお、zwatchdogとして呼ばれる場合は、/var/run/zwatchdog.pidに
PIDを格納する。

これをシステム側から見てキレイに処理するとしたら、/var/run/zserver.pid
というファイルをつくって、そこにプロセスIDを記録するのがいいのだが
このZ2.pidはZope自身が監視しているので、迂闊に変更できない。
結局、キタナイ手だが、killprocファンクションをごっそり/etc/init.d/zope
に持ってくるしかない。
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

処理中...