備忘録:shとbashは違う!? Tomcatの罠(w | きまぐれ倉庫番報告『しん♪』の小言 in BC DN PSO2

きまぐれ倉庫番報告『しん♪』の小言 in BC DN PSO2

オンラインゲーム「ブレイドクロニクル」「ドラゴンネスト」「PSO2」をプレイしている「しん♪」です~^^
本ブログのSS(記事中の画像)の著作権は
ブレイドクロニクルは『(C)Aiming』ですよ~♪
ドラゴンネストは『(C)NHN』ですん~♪
PSO2は『(C)SEGA』ぢゃ♪

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