これも移行したサーバでの話。
tDiary を動かしているサーバを別の場所に動かしたんだけど、そしたら
env: ruby: No such file or directory
というエラーが出て、tDiary が動かなくなってしまった。
どうも、Ruby のパスが取れてない様子。
tDiary のスクリプトは、シェル宣言で直接 /usr/local/bin/ruby という Ruby のパスを指定せず、
#!/usr/bin/env ruby
という具合に、env コマンドで ruby のパスを指定している。(ruby のインストールディレクトリがどこになってもいいようにだろう)
で、/usr/local/bin にある ruby が No such file or directory になるということは、プログラムファイルを探す経路情報である環境変数 PATH に、/usr/local/bin が含まれていないということだ。
実際、CGI で取得出来る環境変数を調べてみると、PATH は、
/sbin:/bin:/usr/sbin:/usr/bin
となっている。/usr/local/bin は確かに含まれていない。
これに関しては、Apache の起動スクリプトで、apachectl を実行する前に、環境変数 PATH に /usr/local/bin を足し込んでやればいい。
こんな感じ。
#!/bin/sh
export PATH=$PATH:/usr/local/bin
/usr/local/apache2/bin/apachectl startssl
しかし、マシンを再起動するまでは、問題なく動いていたのに何故?
同じ OS(FreeBSD 5.X-R)で、マイナーバージョン違いの Apache を動かしているうちのサーバで調べてみると、Apache の環境変数 PATH に、/usr/local/bin は含まれている。
/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin:/root/bin
あれれ、これ、.cshrc 内で指定しているパスじゃん。
set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/bin)
そうか・・・
以前、tDiary をインストールした時、こういう問題が発生せずにすんなり動いたのは、自動起動された Apache ではなく、ユーザが apachectl コマンドをシェル上から実行した Apache だったからかぁ。
謎が解けた。
つまり、/usr/local/etc/rc.d 以下の自動起動スクリプトで起動された時は、PATH には /etc/rc で指定されている
PATH=/sbin:/bin:/usr/sbin:/usr/bin
この値がセットされるのだろう。
で、ユーザが起動した時は、そのシェル上の環境変数 PATH の値がセットされるというわけだろう。
このサーバ、既に4年近くノンストップで動いてて、再起動したことなかったもんな。
それまでに、Apache は何度か STOP/START してるんで、/usr/local/bin へのパスも通っており、tDiary でもエラーが出なかったんだな。
つーことは、/etc/rc の PATH に /usr/local/bin を追加しておけばいいということか。
システムファイルを編集するのは少々気持ち悪いが、/usr/local/bin は追加しても全然問題無い気はするがな。
ま、取りあえず tDiary 以外で問題は発生していないので、暇が出来たら実験してみるということでよかろうてえ。
ちなみに、FreeBSD だと /etc/rc だが、Linux なら /etc/init.d/functions の中でディフォルトの PATH は設定されているようだ。
ああ、原因が分かってすっきりした。寝よ。