非対話型セッションで環境を設定する

非対話型セッションで環境を設定する

私は、ディストリビューションとして Yocto Poky を実行する組み込みデバイスに取り組んでいます。

最終製品には、 によって起動される複数のアプリケーションが含まれますSysVinit。ユーザーは 1 人だけです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 に適切に設定させたりするにはどうすればよいですか?

ブート中は環境はクリーンです (Jet は初期化されていません)。sourceまたは.コマンドsh(サービスがスクリプトの場合) を介して環境変数を設定するか、プログラム内で初期化する必要があります (つまり、構成ファイルを介して)。

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

#!/bin/bash

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

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

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

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

#!/bin/bash

. . .

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

. . .
  1. 私の回避策は有効な解決策でしょうか?

仕事の場合、それはサービスにとって汚い方法です。 1. と 2. を参照してください。

関連情報