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
/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
オーバーライドファイル内にあります。
systemd-system.conf
。 systemdのマニュアルページ。 Freedesktop.org。systemd.exec
。 systemdのマニュアルページ。 Freedesktop.org。/ etc/environmentの内容を明確にするために、次のように提供されています。 :
whereis /etc/environment
environment: /usr/lib/environment.d /etc/environment
上記のwhereis
の結果から、/ etc/environmentがSystemDファイル:
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へのシンボリックリンクがインストールされているため、このファイルも解析されます」
これで混乱が解消されますように。私は少し深く掘る前に、最初は少し頭を掻いていたのを知っています... ;-)
前の回答からわかるように、サービスを起動するとき、Systemdはそのファイルを調達しません。
これをサービス定義に追加しても問題は解決しませんでした
Environment
は、envvarsのインライン定義に使用されます(例:Environment=KEY1=Value1
)。ファイルから読み取るには、EnvironmentFile
ディレクティブを使用します。 EnvironmentFile
が指すファイルは、次の形式である必要があります。
Key1=Value1
Key2=Value2
Systemdはシェルではなく、その情報を適切に処理できないため、シェルの置換または変数の補間を含めないでください。