私はYocto Pokyをディストリビューションとして実行する組み込みデバイスを開発しています。
最終製品には、で実行される複数のアプリケーションが含まれていますSysVinit
。ユーザーは一人だけですroot
。
私たちのアプリケーションに必要ないくつかの環境変数を/etc/init.d
追加するスクリプトがあります。/etc/profile.d
私が直面している問題は、アプリケーションを「手動で」実行すると(インタラクティブシェルがある)、スクリプトがソースとして提供される/etc/profile.d/
ため、正しく実行されますが、実行時に満たされSysVinit
た環境が見つからないことです(明らかに)。私たちはsh
シェルを使用しています。
.bashrc
などの他のファイルやなどのいくつかの.profile
変数を読みました。そこに変数を定義しようとしましたが、運がありませんでした。私が見つけた小さな回避策は、ログインシェル(から)でデフォルトのアプリケーションを起動することでした。ENV
BASH_ENV
SysVinit
2:12345:once:/bin/sh -lc /usr/bin/my_app
だから私の質問は次のようになります
- 起動中に環境を設定したり(ログインは不要)、
SysVinit
良い方法で完了するにはどうすればよいですか? - スクリプト内で実行されたエクスポートは、
/etc/init.d
私の環境にまったく伝播されません。これは、これらのスクリプトがサブシェルで実行され、現在のスクリプト内からインポートされないためです(2回ログインする必要があります)。それでは、どこから変数をエクスポートしますか? ? - 私の解決策は有効な解決策ですか?
答え1
- 起動時に(ログインせずに)環境を設定したり、SysVinitに良い方法で環境を設定したりするにはどうすればよいですか。
起動中に環境がきれいです(ジェットが初期化されていません)。source
または、コマンド(サービスがスクリプトの場合)を介して.
環境変数をデプロイするか、プログラムで初期化(構成ファイルを介してなど)する必要があります。sh
サービススクリプトヘッダーの小さな例:
#!/bin/bash
[ -f /etc/profile.d/needed.sh ] && . /etc/profile.d/needed.sh
. . .
- /etc/init.dスクリプトで実行されたエクスポートは、私の環境にまったく伝播されません。これは、これらのスクリプトが現在のスクリプト(2回ログインする必要がある)から取得するのではなく、サブシェルで実行されるためです。では、そこから変数をどのようにエクスポートできますか?
source
サブシェルのenv変数を使用するか、指定されたenv変数を使用してコマンドを呼び出します。
サービススクリプトヘッダーの小さな例:
#!/bin/bash
. . .
$(BASH_ENV=/etc/profile.d/needed.sh command)
$(ENV_VAR1=value1 command)
. . .
- 私の解決策は有効な解決策ですか?
これが仕事なら、これは汚いサービス方法です。 1と2を参照してください。