web-dev-qa-db-ja.com

Systemd EnvironmentとEnvironmentFileが機能しない

アプリケーションとそのためのsystemdユニットを作成しました。 systemdユニットは正常に動作しますが、devとprodの環境が分かれたため、configを環境変数に移動し始めたので、systemdでそれらを動作させることができません。

私はシステム全体の環境変数を試しましたが、それらはOSからは見えますが、プログラムからは見えません。そのため、systemdユニットへの組み込みを検討し始めました。

まずEnvironmentFileを使ってみました

私は単に持っていた環境ファイルを作成しました

LCSQLH=localhost
LCSQLU=application

/etc/lc.shとして

[Unit]
Description=Service for this app

[Service]
EnvironmentFile=/etc/lc.sh
ExecStart=/usr/bin/env python /opt/app/__init__.py

systemctl --system daemon-reloadを実行しましたが、いいえ、私のエラーが発生しました:

Jan 27 14:24:59 machine.Host env[630]: KeyError: 'LCSQLU'

私はいくつかが持っていたのを見ました:

EnvironmentFile=-/etc/lc.sh

私はそれを試しました...いや...

個別に入れてみました

[Service]
Environment="LCSQLH=localhost"
Environment="LCSQLU=application"
ExecStart=/usr/bin/env python /opt/app/__init__.py

もう一度、いいえ...

だから私は/etc/systemd/service_name.service.dのアイデアについて聞いたので、そこに環境(上記と同じフォーマット)のservice.confを入れましたが...

私のアプリケーションはこれらの環境変数にアクセスできません。

それらを(シェルで手動で、または/etc/profile.d/を使用して)エクスポートし、アプリを直接実行すると機能するので、アプリの問題ではなく、設定されていません。

これはCentos 7.3であり、LinuxまたはWindowsのいずれかで実行される可能性があるため、ハードコードされた構成ではなく環境変数を選択しました。そのため、/ etc /に構成ファイルを埋め込みたくない

6
Keef Baker

私はRHEL 7.3で同じ問題に遭遇し、 this を見つけました:

次に、ExecStart行(および関連する行)で、_/etc/sysconfig/httpd_および_${FOOBAR}_を使用して_$FOOBAR_ファイルに設定された変数を参照できます。

これは、EnvironmentEnvironmentFileの目的があなたや私が期待したものではない(systemdユニットによって開始されたプロセスの環境変数を設定する)と思いますが、即時のExecStart行の拡張。

多分私は完全にベースから外れていて、これはsystemdのバグです(そうだといいのですが)。しかし、私はあなたがしようとしている道を進むのをやめ、それを別の方法で行いました:私の場合、_LD_LIBRARY_PATH_を設定する必要があったので、_/etc/ld.so.conf.d/new_file.conf_を作成してldconfigを実行することでそれを行いました。また、_/etc/profile.d/new_file.sh_でシステム全体の変数を使用しようとしましたが、どうやら_LD_LIBRARY_PATH_を設定するだけでこのサービス(mariadb)で十分だったため、_/etc/profile.d/new_file.sh_は機能していました。

4
noobish

EnvironmentEnvironmentFileは、ユニットが使用できる変数を設定しますが、shコマンドと同様に、子プロセスにエクスポートしません。そのためには、PassEnvironmentシェルコマンドと同じように、exportにリストする必要があります。 EnvironmentFileおよびPassEnvironmentに関するsystemdのドキュメント を参照してください。

また、EnvironmentFileの内容はシェルスクリプトではなく、shにかなり似ているキーと値のペアであるため、.sh拡張は誤解を招くものです。

19
Cameron Kerr