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

/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

答え1

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

適用されますただLinuxでは;ただlogin使用されるようなPAMセッションにただ特定のPAMプラグインがシステムにインストールされて有効になっていて、そのPAMプラグインが他のファイルを使用するように構成されていない場合(/etc/environment特に指定のない限り、これは単なるデフォルトです)。これを読むのはPAMプラグインです。

それ以外の場合は、目的のない無意味なファイルにすぎません/etc

できるsystemd-system.confグローバルに環境変数を設定するみんな変更したいサービスだけでなく、サービスも同様です。

同様にEnvironmentFile、systemdの適切なサービス単位には、環境変数定義のリストを含むパブリックファイルを読み取る方法がありますが、systemdではそのサービス単位を使用しないことをお勧めします。彼らはEnvironmentFileそれが悪い考えだと考え、その使用を間違いと見なします。

すべてのシステムユーザーがこれを行う正しい方法は、Environmentサービスユニットのすべての変数を次の設定に設定することです。実際の環境変数名と値を含みます。ファイル名ではなく設定されます。独自のサービスユニットを作成してここに配置する場合は関連するサービスユニットに直接配置することができ、事前にパッケージ化されたサービスユニットを適用する場合は/etcオーバーレイファイルに配置できます。.conf/lib/usr/lib

追加読書

答え2

以下は何を明確にするためのものです。/etc/環境クエリ時に is/dos で、どのパッケージがそれを提供するか:

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

上記の結果をまとめてwhereis確認します。/etc/環境システムD文書:

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

相談後のman environment.d目的を学ぶ/etc/環境:

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

答え3

以前の回答からわかるように、Systemdはサービスを起動したときにこのファイルをインポートしません。

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

Environment環境変数のインライン定義(たとえばEnvironment=KEY1=Value1)ファイルから読み取るには、EnvironmentFileディレクティブを使用します。指すファイルはEnvironmentFile次の形式でなければなりません。

Key1=Value1
Key2=Value2

何も含めないでください。シェルの交換または変数補間Systemdはシェルではないため、このメッセージを正しく処理できません。

答え4

いいえ、環境変数はスレッド固有の属性なので、グローバルには表示されず、一部の親プロセスまたは親プロセスから継承されます。 Systemd は、システムサービスの起動時にこのファイルを読みません。

関連情報