
サービスを作成しようとしています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
追加読書
- https://unix.stackexchange.com/a/419061/5132
- Lennart Petlinget al。 (2016).
systemd-system.conf
。システムのマニュアルページ。 freedesktop.org. - Lennart Petlinget al。 (2016).
systemd.exec
。システムのマニュアルページ。 freedesktop.org. - Andrew G. MorganとThorsten Kukuk(2010年8月)。 」pam_env — 環境変数の設定/設定解除」。 Linux-PAMシステム管理者ガイド。 linux-pam.org.
答え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 は、システムサービスの起動時にこのファイルを読みません。