非対話型セッションで環境を埋める

非対話型セッションで環境を埋める

私はYocto Pokyをディストリビューションとして実行する組み込みデバイスを開発しています。

最終製品には、で実行される複数のアプリケーションが含まれていますSysVinit。ユーザーは一人だけですroot

私たちのアプリケーションに必要ないくつかの環境変数を/etc/init.d追加するスクリプトがあります。/etc/profile.d私が直面している問題は、アプリケーションを「手動で」実行すると(インタラクティブシェルがある)、スクリプトがソースとして提供される/etc/profile.d/ため、正しく実行されますが、実行時に満たされSysVinitた環境が見つからないことです(明らかに)。私たちはshシェルを使用しています。

.bashrcなどの他のファイルやなどのいくつかの.profile変数を読みました。そこに変数を定義しようとしましたが、運がありませんでした。私が見つけた小さな回避策は、ログインシェル(から)でデフォルトのアプリケーションを起動することでした。ENVBASH_ENVSysVinit

2:12345:once:/bin/sh -lc /usr/bin/my_app

だから私の質問は次のようになります

  1. 起動中に環境を設定したり(ログインは不要)、SysVinit良い方法で完了するにはどうすればよいですか?
  2. スクリプト内で実行されたエクスポートは、/etc/init.d私の環境にまったく伝播されません。これは、これらのスクリプトがサブシェルで実行され、現在のスクリプト内からインポートされないためです(2回ログインする必要があります)。それでは、どこから変数をエクスポートしますか? ?
  3. 私の解決策は有効な解決策ですか?

ベストアンサー1

  1. 起動時に(ログインせずに)環境を設定したり、SysVinitに良い方法で環境を設定したりするにはどうすればよいですか。

起動中に環境がきれいです(ジェットが初期化されていません)。sourceまたは、コマンド(サービスがスクリプトの場合)を介して.環境変数をデプロイするか、プログラムで初期化(構成ファイルを介してなど)する必要があります。sh

サービススクリプトヘッダーの小さな例:

#!/bin/bash

[ -f /etc/profile.d/needed.sh ] && . /etc/profile.d/needed.sh

. . .
  1. /etc/init.dスクリプトで実行されたエクスポートは、私の環境にまったく伝播されません。これは、これらのスクリプトが現在のスクリプト(2回ログインする必要がある)から取得するのではなく、サブシェルで実行されるためです。では、そこから変数をどのようにエクスポートできますか?

sourceサブシェルのenv変数を使用するか、指定されたenv変数を使用してコマンドを呼び出します。

サービススクリプトヘッダーの小さな例:

#!/bin/bash

. . .

$(BASH_ENV=/etc/profile.d/needed.sh command)
$(ENV_VAR1=value1 command)

. . .
  1. 私の解決策は有効な解決策ですか?

これが仕事なら、これは汚いサービス方法です。 1と2を参照してください。

おすすめ記事