スクリプトを使用してブート時にグローバル環境変数を設定し、ログイン前に実行するアプリケーションで使用できるようにする方法は?


17

ブート時に実行されるサービスがあり、そのサービスではバックグラウンドでbashスクリプトを呼び出して、いくつかの環境変数をエクスポートします。私が抱えている問題は、これらの環境変数がバックグラウンドプロセスの親に送信されていないため、スクリプトの実行が完了するとすぐに消えてしまうことです。

また、スクリプトが実行された後、サービスは別のスクリプトを呼び出して、所有しているアプリケーションを起動します。このアプリケーションは、これらの環境変数にアクセスする必要があります。

私がそれを実行するRHELシステムは、ユーザーが決してログインすることはなく、アプリケーションを起動して起動するだけです。ただし、親プロセス/シェルの環境変数は、実際には子バックグラウンドプロセスシェルでは設定できないことを知っています。

私のサービスにそれらを追加することではなく(私にとっても機能しませんでした)、/etc/environmentまたは.profileまたはそのような何か。

私のサービスでは、環境変数を追加しようとしました(しかし、私がやりたいことではありません):

    export TEST=192.168.1.1

私は私のサービスでもこれを試しました:

    TEST=192.168.1.1
    export TEST=${TEST}

サービスがbashスクリプトを呼び出す方法を変更してみました。

    /bin/asdf/script &

また、同じシェルで実行するようにスクリプトをソースしようとしました(これはから取得しました)。

    . ./bin/asdf/script
    #I'm very confused why this didn't work

またこれは面白そうに見えましたが、私の場合はうまくいきませんでした。

回答:


12

変数を収集するスクリプトを入れてみることができます /etc/profile.d/

例:

/etc/profile.d/somescript.sh

#!/bin/bash
TEST=$(cat /var/somefile)
export $TEST

/etc/profileでスクリプトを実行する呼び出しを/etc/profile.d/行います。これは、rootを含むシステム上のすべてのユーザーに適用されます。


ここで何かをしているかもしれません。ただし、IAの理由で/ etcディレクトリにスクリプトを配置できないため、正確には行いません。しかし、そこでスクリプトを指すシンボリックリンクを作成できると思います。しかし、事態を複雑にするために、スクリプトによって設定される環境変数の一部は、サービスによって設定される環境変数から来ています。そのため、サービススクリプトが終了する前に変数を設定する必要がありますが、早すぎたり、必要な環境変数がサービスによってまだ作成されていないため、これは機能しない可能性があります。
sqenixs

サービスに設定された変数への依存関係を取り除くことができると思います。この場合、サービスが開始する前にスクリプトが実行される限り、動作すると思います。ログインシェルがいつ起動するか知っていますか?または、ログインシェルの起動を制御できますか?実行レベルのrcX.dディレクトリにサービスがありません。
sqenixs

1

プロセスが別の既存のプロセスの環境に影響を与える方法はありません。プロセスは、子プロセスの環境にのみ影響します。

したがって、これらの環境変数は、それらを必要とするアプリケーションの祖先に設定する必要があります。サービスが環境設定bashスクリプトとアプリケーションを個別に呼び出す代わりに、サービスが環境変数を設定してアプリケーションを起動するbashスクリプトを呼び出すようにします。

#!/bin/bash
. /path/to/environment/variable/setter.bash
exec /path/to/application

私がオンラインで読んだものから、それを動作させるためのハックがあります(ソーススクリプトでのevalに関連するか、gdbを使用する必要があります)。バックグラウンドにあることにはあまり興味がありません。現在の「シェル」でコマンドを実行できる場合(サービスの実行中にブート中にシェルを使用していますか?)、それでも問題ありません。
sqenixs

残念ながら、サービスからアプリケーションを開始することはできません。多くの異なるプロセスが開始され、アプリケーション開始スクリプトから構成されているものがあり、IAのサービスとは別に保持する必要があるためです。
sqenixs

@sqenixsシェルは他のプロセスと同様のプロセスです。「シェルの中にいる」ということはありません。「ソーススクリプトで評価する」と言えば、それはプログラム(シェルスクリプトではない可能性があります)がシェル構文で定義を出力し、シェルスクリプトがそれらを解釈するプロトコルです。gdbを使用して環境変数を設定すると、動作したり、効果がなかったり、アプリケーションがクラッシュしたりします。ご想像のとおり、実稼働環境でデバッガーを使用することはお勧めできません(また、正当な理由により)。
ジル 'SO-悪であるのをやめる'

おそらくあなたの問題に対する解決策はありますが、あなたはあなたの要件をより正確にする必要があります。あなたの質問では、「スクリプトを実行した後、サービスを実行し、アプリケーションを起動する別のスクリプトを呼び出します」と書きます。したがって、あなたは解決策を持っているようです:他のスクリプト内で環境変数を設定します。しかし、コメントに「サービスからアプリケーションを起動できない」と書いています。それで、どちらですか?
ジル「SO-悪であるのをやめる」

おそらく、起動時に/ sbin / initの環境を作成または構成します。とにかくすべてのプロセスはinitの子であるため、子プロセスは環境を取得できます。ただの考え/推測。
ニヒルマーリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.