以下を使用して環境変数を設定しました/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
除くすべての環境変数を削除することですTERM
。PATH
これは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.bashrc
export 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