
私は現在シェルで定義されている環境変数を私が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
答え2
それが価値がある場合、systemd独自の50-systemd-user.shは、環境変数DISPLAYとXAUTHORITYを取得する方法を提供します。以下を参照できます。
#!/bin/sh
systemctl --user import-environment DISPLAY XAUTHORITY
if command -v dbus-update-activation-environment >/dev/null 2>&1; then
dbus-update-activation-environment DISPLAY XAUTHORITY
fi
https://github.com/systemd/systemd/blob/master/xorg/50-systemd-user.sh
答え3
現在の端末で環境変数を設定してからエクスポートすると、次のようになりsystemctl
ますsudo
。
sudo -E systemctl import-environment <LIST OF ENVIRONMENTS TO BE AVAILABLE FOR SERVICE>