2015/03/14

起動サービスのロケーション設定の驚き


今までは問題なかったが、
OSを再起動してみらアプリの動作がおかしくなった!

どうやら原因はTomcatの環境変数に設定されているロケール情報が起動前と違っていることが原因。

なぜ~・・・

もちろんOSのロケール情報は日本語環境にしてあります。

# cat /etc/sysconfig/i18n
LANG="ja_JP.UTF-8"

# locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

再起動してももちろん変更はされていませんね。
そういえば、プロセスの変数情報を確認できなたと思い確認してみると。

# cat /proc/{PID}/environ
TERM=linuxPATH=/sbin:/usr/sbin:/bin:/usr/binRUNLEVEL=3runlevel=3PWD=/LANGSH_SOURCED=1LANG=en_US.UTF-8PREVLEVEL=Nprevious=NCONSOLETYPE=vtSHLVL=2UPSTART_INSTANCE=UPSTART_EVENTS=runlevelUPSTART_JOB=rc_=/opt/app/tomcat6-ffc/bin/jsvcLD_LIBRARY_PATH=/opt/app/jre/lib/amd64/server:/opt/app/jre/lib/amd64

おやまぁ本当にLANGの値は"en_US.UTF-8"になっている。

いったいどこでこの値は設定されるのだろう?
Shellが起動された時、いろいろprofileやbashrcとかが呼び出されて環境を整えるのでそのあたりか。

# vim /etc/profile.d/lang.sh
~省略
    if [ -n "$LANG" ]; then
      case $LANG in
        *.utf8*|*.UTF-8*)
        if [ "$TERM" = "linux" ]; then
            if [ "$consoletype" = "vt" ]; then
                case $LANG in
                        ja*) LANG=en_US.UTF-8 ;;
                        ko*) LANG=en_US.UTF-8 ;;
                        si*) LANG=en_US.UTF-8 ;;
                        zh*) LANG=en_US.UTF-8 ;;
                        ar*) LANG=en_US.UTF-8 ;;
                        fa*) LANG=en_US.UTF-8 ;;
                        he*) LANG=en_US.UTF-8 ;;
                        en_IN*) ;;
                        *_IN*) LANG=en_US.UTF-8 ;;
                esac
            fi
        fi
profileの中を確認してみると、なにやらコンソールタイプ変数値によて設定するロケールの値を変えている
コンソールタイプ?

確かに再起動後のプロセス情報は"CONSOLETYPE=vt"となっている。

ここか・・・!

確かにSSH等のコンソールからサービスの再起動を行うと、
コンソールタイプは"CONSOLETYPE=pty"となり、日本語ロケールにもなり、コンソール関係の変数も読み込まれている。
細かいところまでは見ていないけれど、コンソールタイプでLANG関係の読み込みも分けている。

f [ -n "$LANG" ]; then
    saved_lang="$LANG"
    [ -f "$HOME/.i18n" ] && . "$HOME/.i18n" && sourced=1
    LANG="$saved_lang"
    unset saved_lang
else
    for langfile in /etc/sysconfig/i18n "$HOME/.i18n" ; do
        [ -f $langfile ] && . $langfile && sourced=1
    done
fi

今回問題になったTomcatはバイナリでサイトから落として利用している。
RPMでインストールするサービスはどうなのか知らないですが、
少なくともコンソールタイプで読み込まれる変数が変わるというのは初耳だった。

今回は起動スクリプトに明示的に"LANG=ja_JP.UTF-8"として問題を回避したが、
(そもそも)環境依存で作りアプリケーションに問題があるかどうかは置いといて。)
どうりでOS再起動時のログファイルは英語になっているわけだよ・・・。

OS依存によるアプリケーションやシステムの構築には気を付けよう!

そして必ずOS再起動でもシステムは問題なく動く事を確認しよう。


詳解 Tomcat
詳解 Tomcat
posted with amazlet at 15.03.14
藤野 圭一
オライリージャパン
売り上げランキング: 19,989

0 コメント:

コメントを投稿