SystemdでExecStartPreを使用してオペレーティングシステム環境変数を作成する

SystemdでExecStartPreを使用してオペレーティングシステム環境変数を作成する

次の単位ファイルがあります。

[Unit]
Description=Panel for Systemd Services
After=network.target

[Service]
User=pysd
Group=pysd
PermissionsStartOnly=true
WorkingDirectory=/opt/pysd
ExecStartPre=/bin/mkdir /run/pysd
ExecStartPre=/bin/chown -R pysd:pysd /run/pysd
ExecStart=/usr/local/bin/gunicorn app:app -b 127.0.0.1:8100 --pid /run/pysd/pysd.pid --workers=2
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
ExecStopPost=/bin/rm -rf /run/pysd
PIDFile=/run/pysd/pysd.pid
PrivateTmp=true

[Install]
WantedBy=multi-user.target
Alias=pysd.service

環境変数を作成し、ExecStartPreその変数をExecStart

具体的には、GUNICORN_SERVER実行する前に環境変数を作成してExecStartから、この環境変数-bExecStart

同様のことを試しましたが、ExecStartPre=/bin/bash -c 'export GUNICORN_SERVER=127.0.0.1:8100'環境変数は生成されませんでした。

このシナリオをどのように実装しますか?

ベストアンサー1

ExecStartPre他のコマンドの環境を直接設定することはできません。これは別のプロセスです。 (間接的にファイルに保存して読み込むなどの方法で可能です。)ExecStartPreExecStart

Systemdには環境を設定する2つの方法がありますEnvironment=EnvironmentFile=両方の例がありますman 5 systemd.exec。これは、を含むサービスが開始するすべてのプロセスに影響しますExecStartPre。これらの変数を動的に設定する必要がない場合は、次を選択することをお勧めします。

Environment=GUNICORN_SERVER=127.0.0.1:8080

ただし、変数を動的に設定する必要がある場合は、マンページで次のことを説明しますEnvironmentFile

The files listed with this directive will be read shortly before the process is
executed (more specifically, after all processes from a previous unit state
terminated. This means you can generate these files in one unit state, and read it
with this option in the next).

したがって、1つのオプションはファイルに書き込み、システムにExecStartPreファイルを次の一部として読み取らせることですEnvironmentFile

EnvironmentFile=/some/env/file
ExecStartPre=/bin/bash -c 'echo foo=bar > /some/env/file'
ExecStart=/some/command  # sees bar as value of $foo

別のオプションは、次のシェルを使用することですExecStart

ExecStart=/bin/sh -c 'export GUNICORN_SERVER=127.0.0.1:8080; exec /usr/local/bin/gunicorn ...'

おすすめ記事