現在のシェルの環境変数をsystemdデバイスに渡します。

現在のシェルの環境変数をsystemdデバイスに渡します。

私は現在シェルで定義されている環境変数を私がsystemd作成しているユニットの1つに渡そうとします。

DB_URL=databus.dev.mysite.io:8080

私はこれをサービスとして実行するPythonスクリプトで使用しています。私のsystemdユニットはこのスクリプトを1つのユニットとして実行し、この変数を使って作業します。

[Unit]
Description=device-CompStatus: Computes device availability status
           
[Service]
Type=simple    
ExecStart=/usr/bin/bash -c "/usr/bin/python /opt/deviceCompStatus/deviceCompStatusHandler.py"
Restart=always
         
[Install]
WantedBy=default.target

Pythonスクリプトで変数を使用する方法は次のとおりです。

if os.environ.get('DB_URL') is not None:
    dbEndPoint = "http://" + os.environ['DB_URL']

問題は、スクリプトの実行時に変数が使用できないことですsystemd。いくつかのリソースを確認しました。システム単位での環境変数の使用[Service]、割り当てを次のように直接使用するように指示されています。

[Service]
Environment=DB_URL=databus.dev.mysite.io:8080

ご覧のように、DB_URL自分のコンピュータを展開する環境、開発者、または本番設定によってURLが変わる可能性があるため、変更されることがあります。

これをどのように動的に実行できますか?つまり、利用可能な値をDB_URL環境に渡しますかsystemd

私も試しました。EnvironmentFile=ファイルを定義してサービスに渡すオプション。しかし、同じ問題が再び発生します。私の変数は動的かもしれませんできないハードコードされています。

修正する

このオプションを使用した後

systemctl import-environment DB_URL

systemd私が確認した環境で利用可能な変数を確認できます。

systemctl show-environment
DB_URL=databus.dev.mysite.io:8080
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

pythonただし、実行中のアプリケーションにはまだ値が反映されません。os.environ('DB_URL')変数にアクセスする方法が間違っていますか?

ベストアンサー1

以下を使用して、(再起動するまで)すべての将来のコマンドがグローバルシステム環境に影響を与えることができます。

 sudo systemctl set-environment var=value

または、すでにvar環境からエクスポートしている場合は、次のものを使用できます。

 sudo systemctl import-environment var

同様の方法を使用してデバイスを起動した後、unset-environment変数を削除できます。

DB_URL=databus.dev.mysite.io:8080これは実際にグローバルであるため、その行をいくつかのファイルに書き込んで/some/fileユニットEnvironmentFile=/some/fileに設定する方が良いでしょう。

[email protected]別の方法は、で始まるテンプレート単位を使用することですsystemctl start myunit@'databus.dev.mysite.io:8080'%iその後、セル内(たとえば、[Service]次の行を含むセクション)内でこのパラメータを復元できます。

Environment=DB_URL=%i

おすすめ記事