Linux・・・特にCentOSを触っててハマったので・・・メモしておきますよ。
sh と bash は挙動が違う・・・あたりまえですやんw
私も知ってたはずなんですが・・・。
ちょっと落とし穴がありました・・・。
昔はたしかに、shとbashは別物って知ってました。
でもですね。純粋なshは廃れ気味で・・・とかいう話を聞いた事ありまして。
「最近のは内部ではbash使ってるねん。」と聞いて、調べた事があるんですよ。
そしたら、
/bin/sh は /bin/bash へのシンボリックリンクでした。。。(^^;;;;
だ・か・ら・・・勘違いしてました。
挙動も同じだと・・・。
同じバイナリを起動してるんですが、、、shで呼び出したときと、bashで呼び出したときで、挙動が違います!!
もちろん、シェル起動後のインタラクティブコマンドの解釈ロジックとかは、同じメカニズムだと思います。
具体的に違う箇所は、実行時の環境変数とかですね。
私の環境(CentOS6.4)では、bashrc(/etc/bashrc、~/.bashrc 共に)や bash_profile が読み込まれてませんでした。
知人に相談したところ、POSIXがonになってたりoffになってたりとか、そういう違いもあるそうですね。
そりゃあ、いくら「.bashrc」に初期処理や環境変数を追記しても何も変わらないわけだわ・・・orz
普通に利用する上ではshを呼び出すことはなと思うので、問題になるケースは少ないかもしれませんね。
シェルスクリプトの先頭行を、「#!/bin/sh」とプログラムした場合は注意ですね~。
私がハマったのは、Tomcat6の起動スクリプト。
yumを利用してインストールした際に自動で作成される、サービス起動スクリプト。
/etc/rc.d/init.d/tomcat6
Tomcatのサービス起動・停止にはこのスクリプトを使っていました。
Tomcat起動時の、実行ユーザをtomcatとして運用したいのですが、
Tomcat上で動かすアプリ、このアプリは処理の途中で新規作成するのですが、そのファイルのパーミッションが「umask 022」状態になっています。
umask 002 で作って欲しいので、tomcatユーザのログイン時に起動しようと思って、
tomcatユーザの「.bashrc」や「.bash_profile」や「/etc/rc.d/init.d/tomcat6」内に
「umask 002」と記述しましたが・・・うまくいかなかったのです・・・。
原因は「/etc/rc.d/init.d/tomcat6」のTomcat起動にありました。
上記スクリプト内で、
su - tomcat -c "Tomcatのスタートアップコマンド"
という処理の記述がありました。
ふむ。suを利用して、rootユーザから実行してもtomcatユーザとしてTomcatを起動するようになっている。
・・・が、
実はこの記述、「su」ではなく「$SU」となっていた。
・・・なるほど、変数にコマンドのフルpathを入れてるんだな・・・。
・・・と思ったら、その先に落とし穴が。
「SU="su -s /bin/sh "」
・・・・・・おぉぅ。。。
「-s」オプションは推察するに、su実行後のシェルはこのシェルを使ってね、と指定するオプションに違いない。
記事前半で書いたことを知らなければ、完全にスルーしていたけれども・・・。
これ、bashにしたら解決?
みたいな。。。
スクリプト内に該当箇所は複数あるみたいだし・・・、
もしかして、bashrc内に設定済みの関係ない環境変数が、Tomcatの起動に悪影響を与えてしまったら嫌なので・・・、
TOMCAT_SCRIPTという変数を
前「/usr/xxx/xxx/Tomcatスタートアップコマンド」
↓
後「umask 002; /usr/xxx/xxx/Tomcatスタートアップコマンド」
として、対処しますた。。。w;
suをsudoにしても良い気もするけれど、制限かけたり解除したりが面倒だったり。。。
試すのも面倒だったり・・・www;
Tomcat起動に環境変数を持ち込むには、
/bin/sh 実行時に読み込む環境変数のファイルへ書き込むか(そんなファイルがあるのか調べてないのでわかりませんがw)、、、あるいは・・・というか色々やりかたはありそう。
偉い人、スマートな方法教えてw
とにかく、Tomcat起動には /bin/bash ではなく /bin/sh が使われている可能性があることを、知っていても損はないと思いますよw