異なるバージョンの httpd を ipalias 環境で複数起動

ポートを変えて複数起動させることはやったことあったんだけど、とある案件のため、複数 IP が振ってあるサーバで環境を構築することになった。

難儀なのは担当しているサーバの VHOST の整理で、技術的に問題になることは少ない。適切に configure し、make を掛ければよい。
チューニングを施し、さあ運用と、割と順調に推移したのだが、うっかり daemon自動起動スクリプトの設定を忘れていた。


これがちょっと面倒だった。

  • pidfile やら lockfile やらは httpd-mpm.config に記述
  • RHEL 系なので、起動スクリプトは /etc/init.d/ 配下で管理。適切に shell script を設定

これでいけると思いきや、軽い罠が潜んでいた。
新しく切り分けた httpd に対して、service [script_name] status とすると、古いほうの httpd の pid が返る。/etc/init.d/functions を確認すると、

status() {
        local base=${1##*/}
        local pid

とかなってる。
んだこれ。shell 変数は微妙に忘れてしまったが、ARG =~ s[^.*/][];*1 ってことか??
んー、とりあえず echo $base とかを仕込んでみるとどうやら挙動としては PATH のディレクトリ部分を削るという解で良いようだ。
なるほど、新旧両方とも実行バイナリのファイル名は httpd だから判断付かなくなってんだな、こりゃ。
functions によると、status 実行時に対象の pid を知るための First Try は pidof で、Next Try が pid ファイルの確認になってるのはなぜだろう。先に pid ファイルを見たほうがいいんじゃねぇの??*2


今回は結構力技で解決したけど、多分 Best Practice は別に存在するんだろうなぁ。

*1:最長マッチ前提

*2:うぬー、どうやら少なくとも status 実行時の pid ファイルは pid を知るために使うのではないようだ