
systemd
特定のユーザーでサービスを実行しています。
私は、サービスが、すべてのユーザーがスクリプト/エクスポートから継承する環境変数にアクセスできると誤って想定していました。/etc/profile.d
systemd
ユニット ファイル定義内の変数を手動でコピーせずにこれを実現する方法はありますか。
例えば、次のようなものがあります
$ cat /etc/profile.d/somexports
export VAR1=VALUE1
export VAR2=VALUE2
これをサービスに渡したりエクスポートしたりすることはできますかsystemd
?
答え1
環境の原因としては、次のようなものが考えられます。
- whichを使用すると
Environment=
変数を設定できます - whichを使用すると
EnvironmentFile=
ファイルから値を読み込むことができます - which を使用すると
PassEnvironment=
、PID1 から渡される変数を定義できます。 - 静的構成(例
$USER
)
は必要なことのように聞こえるかもしれませEnvironmentFile=/etc/profile.d/someexports
んが、そうではありません。 /etc/profile.d/*
は多くの場合、シェルによってソース化され、シェルによって解析できます。 systemd
はシェルに依存しないため、bash 構文に依存しません。 には、EnvironmentFile
より厳密な改行で区切られた変数割り当てを含める必要があります。
systemd
の設計では、ユニットやその環境を動的に変更することは推奨されていません。 このEnvironmentFile=
オプションも圧力の結果として追加されただけであり、後に のsystemd
開発者によって間違いであると判断されました。 この設計の一例は、 がどのバイナリが使用されるかには影響しないことです$PATH
。 これにより、ユニットを定義するときに、外部の影響を気にせずにそのユニットがどのように実行されるかをすべて定義するため、物事がより決定論的になります。
したがって、簡単に答えると、「いいえ」です。ロードすることはできません/etc/profile.d/*
がsystemd
、これは意図的なものです。
しかし、おそらくあなたが知りたい答えは、「はい、ロードできます」です。シェルを介してアプリケーションを実行するだけです。
以下を変更することで実現できます:
ExecStart=/usr/bin/myservice
に
ExecStart=/usr/bin/bash -lc myservice
これにより、bash
が親プロセスになり、/etc/profile.d/
その環境が読み込まれ、子に転送されます。 への完全な絶対パスを指定していないことにも注意してください。myservice
この場合、myservice
は に基づき$PATH
、 は である場合もそうでない場合も/usr/bin/myservice
あります。これによりトラブルシューティングが困難になる可能性があることがわかります。これが、この方法を採用することの欠点です。
答え2
これは次のように対処されると思います
ExecStart=/bin/sh -lc /path/to/binary
この-l
フラグは、シェルの呼び出しをログイン シェルにします。ログイン シェルのみがプロファイル スクリプトをソースとするため、これが必要です。
$ bash --help | grep -- -l
GNU bash, version 4.4.12(1)-release-(x86_64-pc-linux-gnu)
--login