web-dev-qa-db-ja.com

/ etc / environmentの環境変数はグローバルに表示されませんか?

systemdサービスを作成しようとしています。

このサービスには、いくつかの環境変数を使用することになっているスクリプトがあります。

だから私はこれを作成しました:

cat /etc/systemd/system/atlantis-server.service 
[Service]
ExecStart=/usr/local/bin/atlantis-server.sh

これは何を指している

pkara@atlantis-server:~$ cat /usr/local/bin/atlantis-server.sh 
#!/bin/bash
source /etc/environment
atlantis server --atlantis-url="$URL" --gitlab-user="$USERNAME" --gitlab-token="$TOKEN" --gitlab-webhook-secret="$SECRET" --gitlab-hostname="$HOSTNAME" --repo-whitelist="$REPO_WHITELIST"

systemdログでいくつかのエラーが発生した後)気付いたのは、明示的にsource /etc/environment

(これは、上記の変数が宣言されている場所です)。

なぜこれが必要なのですか?

彼らは世界的に見えませんか?

編集:これをサービス定義に追加しても問題は解決しませんでした

Environment=/etc/environment
3
pkaramol

/etc/environmentはグローバル構成ファイルではありません。

Linuxではのみが適用されます。 onlyto PAMセッション、loginなどで使用されます。およびonly特定のPAMプラグインがシステムにインストールされて有効になっていて、そのPAMプラグインが他のファイルを使用するように構成されていない場合( /etc/environmentは、特に指定されていない場合のデフォルトです。それを読み取るのは、そのPAMプラグインです。

それ以外の場合は、何も使用しない/etcの意味のないファイルにすぎません。

あなたはcould環境変数をsystemd-system.confでグローバルに設定できますが、これはallサービスにのみ適用されます。あなたは変えたいのです。

同様に、適切なサービスユニットのEnvironmentFileは、systemdに環境変数定義のリストを含む共通ファイルを読み取らせる方法ですが、systemdの人々はその使用を推奨しません。彼らは、EnvironmentFileを悪い考えと見なし、その使用を誤りと見なしています。

Systemdの担当者ごとにこれを行う適切な方法は、サービスユニット内の各変数をEnvironment設定で設定することです。これは実際の環境変数名と設定される値を含み、ファイル名。これが関連するサービスユニットに直接存在する場合もあります。ここで、独自のサービスユニットを記述して/etcに配置する場合は、または、事前にパッケージ化されたサービスユニットを.confまたは/libで調整する場合は、/usr/libオーバーライドファイル内にあります。

参考文献

9
JdeBP

/ etc/environmentの内容を明確にするために、次のように提供されています。 :

whereis /etc/environment
environment: /usr/lib/environment.d /etc/environment

上記のwhereisの結果から、/ etc/environmentSystemDファイル:

Sudo dpkg -S /usr/lib/environment.d
systemd, snapd: /usr/lib/environment.d

コンサルティングman environment.d/ etc/environmentの目的が伝えられます:

"environment.dディレクトリユーザー環境の「グローバル」環境変数割り当てのリストが含まれています。systemd-environment-d-generator(8)はそれらを解析して環境を更新しますsystemdユーザーインスタンスによって開始されるサービスにエクスポートされます ....下位互換性のために、/ etc/environmentへのシンボリックリンクがインストールされているため、このファイルも解析されます

これで混乱が解消されますように。私は少し深く掘る前に、最初は少し頭を掻いていたのを知っています... ;-)

1
F1Linux

前の回答からわかるように、サービスを起動するとき、Systemdはそのファイルを調達しません。

これをサービス定義に追加しても問題は解決しませんでした

Environmentは、envvarsのインライン定義に使用されます(例:Environment=KEY1=Value1)。ファイルから読み取るには、EnvironmentFileディレクティブを使用します。 EnvironmentFileが指すファイルは、次の形式である必要があります。

Key1=Value1
Key2=Value2

Systemdはシェルではなく、その情報を適切に処理できないため、シェルの置換または変数の補間を含めないでください。

1
Sergey Papyan