Unixサービスで環境変数を確認するには?

Unixサービスで環境変数を確認するには?

以下を使用して環境変数を設定しました/etc/profile

export VAR=/home/userhome

そして私がecho $VARこれを行うと、次のように表示されます。/home/userhome

ただし、この変数への参照をファイルに入れると、/etc/init.d/servicename変数は見つかりません。以下を含むファイルservice servicename statusとして実行するとき:/etc/init.d/servicename

case "$1" in
status)    
    cd $VAR/dir
    ;;
esac

それは言う/dir: No such file or directory

しかし、私が/etc/init.d/servicename status代わりに走った場合service servicename status

Unixサービスで環境変数を確認するには?

答え1

問題は、をservice除くすべての環境変数を削除することですTERMPATHこれはLANG良いことです。スクリプトを直接実行しても環境変数は削除されないため、すべてがうまく動作します。

環境変数が起動時に存在せず、初期化システムがそれを設定しない可能性があるため、外部環境変数に依存したくありません。

それでもそのような変数に依存したい場合は、ファイルをインポートして変数を読みます。たとえば、次のようにし/etc/default/servicenameます。

VAR=value

次のように初期化スクリプトから取得します。

[ -f /etc/default/service-name ] && . /etc/default/service-name

if [ -z "$VAR" ] ;  then
  echo "VAR is not set, please set it in /etc/default/service-name" >&2
  exit 1
fi

case "$1" in
status)    
    cd "$VAR"/dir
    ;;
esac

答え2

私の場合は:に1つを設定する必要がありましたRAILS_ENV。スクリプトで使用できるように変数を追加しました。ファイルの残りの部分を含める必要がないようにしました。/etc/bash.bashrcexport RAILS_ENV=staging$(grep RAILS_ENV /etc/bash.bashrc)

答え3

一つ醜いまた利用できる解決策:

function exec() {
    args=( $@ )
    command=${args[0]}
    dummy=${args[1]}
    whoami=`whoami`
    if [ -z "$dummy" ]; then
        me=`basename $0`
        runuser -l ${whoami} -c "bash /etc/init.d/${me} ${command} dummy"
    else
       printenv
   fi
}

case $1 in
    status)
        status
        ;;
    start|stop|kill|restart)
        exec $*
        ;;
    *)
        usage
esac

関連情報