UNIXサービスに環境変数を表示させる方法は?


52

以下を使用して環境変数を設定しました/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サービスに環境変数を表示させるにはどうすればよいですか?


システム5呼び出すことを注意rcスクリプトは、直接また、スクリプトのすべての呼び出しは、の呼び出しになっているとして、systemdにオペレーティング・システム上でそのように動作していないsystemctl隠されたフックで。
JdeBP

回答:


70

問題は、service以外のすべての環境変数を削除することTERMPATHあり、LANGこれは良いことです。スクリプトを直接実行している場合、環境変数は何も削除されないため、すべてが機能します。

起動時に環境変数はおそらく存在せず、initシステムはおそらくそれを設定しないので、外部環境変数に依存することは望ましくありません。

それでもそのような変数に依存したい場合は、ファイルをソースし、そこから変数を読み取ります。たとえば/etc/default/servicename、コンテンツで作成します。

VAR=value

そして、initスクリプトからソースします。例:

[ -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

13
とても助かります、ありがとう。他のLinux初心者のために、ここに不可解なBashのものがあります。[ ... ]条件付きテストの略記です。この答えをご覧ください。ファイルが存在するかどうかをチェック-fするif引数です。&&は、短絡演算子です。最初のコマンドが0で終了する場合にのみ、2番目のコマンド.を実行します。source またはdot演算子:filename引数からコマンドを読み取って実行します。長さゼロの文字列をチェック-zするif引数です。 >&2出力をstderrに送信します。ifの概要も参照してください。
マークベリー14年

@MarkBerry -fはの一部であり[、ではありませんif
クリスダウン

@ChrisDown、ありがとう。したがって、「[ ... ]条件付きtestコマンドの省略形です。この回答を参照してください。ファイルが存在するかどうかを確認-fするtest引数です。」
マークベリー

@MarkBerry正しい。[(またはtest)を単なる別のコマンドと考えることができます。すべてifは、終了ステータスに基づいて何らかのアクションを実行するだけです。
クリスダウン

これに似た状況に陥りました$VARが、initスクリプトにいる必要はありません。initスクリプトの下流の別のプログラム2または3呼び出しで使用できるようにする必要があります。例えば。initスクリプトは、必要なプログラム2を呼び出すプログラム1(Java)を呼び出すstart-stop-daemonを呼び出します$VAR。この回答でトリックを試しましたが、私の状況ではうまくいかないようです。それ$VARをプログラム2で利用できるようにするにはどうすればよいですか?
FrustratedWithFormsDesigner

1

私の場合、私は必要RAILS_ENVに設定されたもの/etc/bash.bashrcexport RAILS_ENV=staging。追加$(grep RAILS_ENV /etc/bash.bashrc)して、変数をスクリプトで使用できるようにしました。このようにしたので、残りのファイルを含める必要はありませんでした。


-1

一つの醜いも動作するソリューション:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.