読者です 読者をやめる 読者になる 読者になる

service コマンドの環境変数でハマった話

新しく作成してもらったサーバ上からflumeを使って別サーバにログファイルを転送した時に日本語が文字化けする現象がありまして。なんだろう?と思ってflumeを管理してる別チームから「LANGの設定がUTF-8ではないとおもいますよ」と教えてもらいました。

でも、envとかすると"LANG=ja_JP.UTF-8"とでてくるし、うーんと思ってて、flumeを立ち上げた時にscriptコマンドでログをとってたので見返してたら、もしかしてservice は環境変数が引き継がれないのは知ってるけどLANGもか??となんとなく思ってググってたら、デーモンの起動・終了にはserviceコマンドを利用しよう - インフラエンジニアway - Powered by HEARTBEATS に答えが載ってました。引用すると、

  • serviceコマンドを用いると、実行ユーザの環境変数の設定状況に影響を受けにくくなる。
  • OSによっては、環境変数の引き継ぎ方がmanの記述とは違う動きをする。
  • 直接スクリプトを実行すると、実行ユーザ毎に設定した環境変数によって動きが変わりかねないのでできるだけ避ける。

なんといっても一番最後のがポイントですね

上のブログでもやってましたが。こちらでも。

[root@CentOS ~]# cat /etc/init.d/echo-env
#!/bin/sh

# chkconfig: - 64 36

env
[vagrant@CentOS init.d]$ env | grep LANG
LANG=ja_JP.UTF-8
[vagrant@CentOS init.d]$ sudo /etc/init.d/echo-env | grep LANG
LANG=ja_JP.UTF-8
[vagrant@CentOS init.d]$ sudo service echo-env | grep LANG
[vagrant@CentOS init.d]$

確かに。

じゃぁ、どう対応するの?というと、他の/etc/init.d内にあるファイルを読むと見えてきます

  1. /etc/sysconfig/i18n にある設定を変更して、起動スクリプト内から /etc/init.d/functions を読みこませる
  2. /etc/sysconfig/ に設定ファイルを書いてそれを読みこませる

i18nを変更すると全体的な影響があるのでそこを考慮できてれば、そちらを変更するほうが他のサービスまで変更できるのでいいのですが、そこが考慮できてない時は後者のほうがよいかと思います。(そして考慮できてないことがほとんど)

/etc/init.d/functions にはdaemonやkillproc関数があるので、サービス作るときは両方読みこませたほうがいいですね。
そしてちゃんと環境変数の確認もしなきゃなぁ。ちなみに今回はサーバに作成してもらった人はVisualVMで確認してました。うーむ便利だ。