RHELでserviceコマンドから起動した時、環境変数LANGは無効化される

はじめに

RHEL7でserviceコマンドから起動した時、環境変数LANGが効いていない事象に遭遇したので、ちょっと調べてみました。

事前準備

こんな感じの確認用起動スクリプトをsampleserviceという名前で作成して、chkconfigで登録

  • $ vi /etc/init.d/sampleservice
    #!/bin/bash
    # chkconfig: 2345 99 99
    # description: 日付と環境変数LANGを出力する
    
    echo `date`
    echo `env | grep LANG`
    $ chmod +x sampleservice
    $ chkconfig --add sampleservice

OSはRed Hat Enterprise Linux Server release 7.2 (Maipo)で確認してみます。

 

起動方法ごとの環境変数の見え方

  • 普通にシェルを実行した場合は環境変数LANGが見えてます。
    $ source /etc/init.d/sampleservice
    Wed Sep 14 10:36:58 EDT 2016
    LANG=en_US.UTF-8

 

    • serviceコマンドから実行した場合は環境変数LANGが見えません。
      $ service sampleservice start
      Wed Sep 14 10:36:58 EDT 2016
      
      

 

  • さっきのsampleserviceの標準出力を/tmp/env-test以下にリダイレクトするように変えてOS再起動してみると今度は環境変数LANGが見えました。
    $ vi /etc/init.d/sampleservice
    ...
    echo `env | grep LANG` > /tmp/env-test
    $ shutdown -r now
    $ cat /tmp/env-test
    Wed Sep 14 10:47:59 EDT 2016
    LANG=en_US.UTF-8
    

 

マニュアルを確認

man service見てみるとこんなことが書いてありました。

  • DESCRIPTION
           service  runs  a  System  V  init script in as predictable environment as possible,
           removing most environment variables and with current working directory set to /.

大半の環境変数は無効化されるとのことです。/usr/sbin/service見てみたら確かにenv -i して環境変数無効化していました。

OS起動時は環境変数LANGが見えた理由

OS起動時は/usr/sbin/serviceからの起動でないため、/usr/sbin/serviceでenv -i して環境変数無効化しているルートに入らないためのようです。

 

systemctlでも確認

systemctl start ….で起動した場合は環境変数LANGが見えたので、またちょとserviceコマンドとは違う。。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA