web-dev-qa-db-ja.com

systemdサービスユニットファイルの動的変数

Systemdサービスユニットファイルで環境変数を動的に割り当てる方法はありますか?

4つのGPUを備えたマシンがあり、GPUごとに特定のサービスの複数のインスタンスを起動したいとします。例えば。:

  • gpu_service @ 1:1.service
  • gpu_service @ 2:1.service
  • gpu_service @ 3:1.service
  • gpu_service @ 4:1.service
  • gpu_service @ 1:2.service
  • gpu_service @ 2:2.service
  • gpu_service @ 3:2.service
  • gpu_service @ 4:2.service
  • 吐き気

したがって、1:1、2:1などは、実際にはサービスユニットファイルの%iです。

サービスが特定のGPUにバインドするために、サービス実行可能ファイルは特定の環境変数をチェックします。

USE_GPU=4

サービスユニットファイル内で%iを取得し、それをいくつかの(シェル)関数で実行してGPU番号を導出し、それに応じてUSE_GPU環境変数を設定する方法はありますか?

最も重要なのは、複数の/etc/systemd/system/gpu_service@x:y.service/local.confファイルを作成する手間を省いて、より多くのインスタンスを起動できるようにすることです。

15
Kal

注意が必要な場合は、小さなbashスクリプトシーケンスをexecコマンドとしてインスタンスサービスファイルに組み込むことができます。例えば

ExecStart=/bin/bash -c 'v=%i; USE_GPU=$${v%:*} exec /bin/mycommand'

文字列の$$は、bashに渡される結果では単一の$になりますが、より重要なのは、systemdによる${...}の補間が停止することです。 (systemdの以前のバージョンは$$の使用を文書化していなかったため、それがサポートされているかどうかはわかりません)。

11
meuh

組み込みはありません。サービスを開始する前に、これらのことを行う必要があります。 1つの方法は、環境ファイルに置くことです。

[Service]
# Note you need to escape percentage sign
ExecStartPre=/bin/sh -c "my_awesome_parser %%i > /run/gpu_service_%i"
EnvironmentFile=/run/gpu_service_%i
ExecStart=...
8
Umut

Systemdユニットファイル内で実際に環境変数を設定できるようです...

コメント投稿者からの提案に従って、ここに解決策があります:

Systemdユニットでの環境変数の使用

環境ディレクティブ

systemdには、実行されたプロセスの環境変数を設定するEnvironmentディレクティブがあります。スペースで区切られた変数割り当てのリストを受け取ります。このオプションは複数回指定できます。その場合、リストされたすべての変数が設定されます。同じ変数が2回設定されている場合、後の設定が前の設定をオーバーライドします。空の文字列がこのオプションに割り当てられている場合、環境変数のリストはリセットされ、以前のすべての割り当ては無効になります。環境ディレクティブは、etcd2やflannelなどの組み込みのContainer Linux systemdユニットで使用されます。

以下の例では、暗号化を使用するようにetcd2デーモンを構成できます。 etcd2.serviceの/etc/systemd/system/etcd2.service.d/30-certificates.confドロップインを作成するだけです:

[Service]
# Client Env Vars
Environment=ETCD_CA_FILE=/path/to/CA.pem
Environment=ETCD_CERT_FILE=/path/to/server.crt
Environment=ETCD_KEY_FILE=/path/to/server.key
# Peer Env Vars
Environment=ETCD_PEER_CA_FILE=/path/to/CA.pem
Environment=ETCD_PEER_CERT_FILE=/path/to/peers.crt
Environment=ETCD_PEER_KEY_FILE=/path/to/peers.key

次に、Sudo systemctl daemon-reloadおよびSudo systemctl restart etcd2.serviceを実行して、etcd2デーモンに新しい環境を適用します。

次のURLから引用された引用テキスト: https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html

3
CyberK

それは醜く、あなたが要求したものではなく、自動起動もできませんが、フォロワーのためにsystemctl environment を使用して何かを行うことは可能です:

$ Sudo systemctl set-environment USE_GPU=4 # add it to the env. variables for future services
$ Sudo systemctl start gpu_service@4:2.service

可能なすべての方法をリストしようとしています:)

0
rogerdpack