アプリケーションとそのための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 /に構成ファイルを埋め込みたくない
私はRHEL 7.3で同じ問題に遭遇し、 this を見つけました:
次に、
ExecStart
行(および関連する行)で、_/etc/sysconfig/httpd
_および_${FOOBAR}
_を使用して_$FOOBAR
_ファイルに設定された変数を参照できます。
これは、Environment
とEnvironmentFile
の目的があなたや私が期待したものではない(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
_は機能していました。
Environment
とEnvironmentFile
は、ユニットが使用できる変数を設定しますが、sh
コマンドと同様に、子プロセスにエクスポートしません。そのためには、PassEnvironment
シェルコマンドと同じように、export
にリストする必要があります。 EnvironmentFileおよびPassEnvironmentに関するsystemdのドキュメント を参照してください。
また、EnvironmentFileの内容はシェルスクリプトではなく、shにかなり似ているキーと値のペアであるため、.sh
拡張は誤解を招くものです。