Systemd はサービス名を動的に割り当てます。

Systemd はサービス名を動的に割り当てます。

サービスファイルでサービス名を動的に設定する方法はありますか?

異なる入力パラメータを使用してサービスの複数のインスタンスを実行しています。デバッグの場合、すべてのサービスが同じように呼び出され、実際に苦情を申し立てるサービスを見つけるのは面倒である可能性があるため、これは最適ではありません。だから私が望むのは、与えられた入力に対してサービスに一意の名前を付けることです。 Systemdsサービスファイルは、ExecStartarg [0]を変更するためにプレフィックス "@"を設定することによってこの機能をサポートします。ここで、2番目の引数はarg [0]の値になります。

ExecStartコマンドに関する情報と@プレフィックス: https://www.freedesktop.org/software/systemd/man/systemd.service.html

これはこれまで私のサービスファイルの内容です。

ExecStart=@/usr/bin/foo foo-%I %I

入力パラメータはファイルなので、bar-123.jsonと同じ名前が付けられます。これはtop、ps、または私たちが使用するQAツールを使用するときに機能し、サービス名はfoo-bar-123.jsonになります。入力ファイルは、systemctl dbus apiを使用して "foo"サービスインスタンスを起動する他のサービスによって生成されます。

しかし、foo-bar-123.jsonというサービスを持つことは最善ではなく、foo-barと呼びたいと思います。

私はテストで実行しようとしました。

**ExecStartPre=/bin/sh -c 'export NAME=bar'**
**ExecStart=@/usr/bin/foo foo-${NAME} %I**

しかし、それでは名前は「foo-」になります。サービスファイルがシェルスクリプトではないため、これは期待できることだと思いますが、これが私が考えることができる唯一のソリューションです。

他の問題に対する解決策も歓迎します。 prctl関数のPR_SET_NAMEはプロセス名も変更する必要があることを知っていますが、それが誰に関連しているかはわかりません。 prctl関数を使用したくない理由は、名前の長さがヌルバイトを含む16バイトしかないためです。これは私がしたくない制限です。

答え1

通常、システムサービスユニットインスタンスを使用する方法は2つあります。たとえば、各インスタンスで/etc/sysconfigオーバーライドされるファイルを使用します。基本オプション変数(EnvironmentFileサービス定義では、これらのファイルはロードされ、入力されます。オプション(例を参照systemctl show -p ExecStart sshd)または「ドロップイン」ディレクトリを介してより多くの単位定義を上書きします。<service>@instance.service.d

ただし、インスタンスには「@」が必要です。それ以外の場合はインスタンスではありません。

gettyサービスユニットでどのように使用されているかを確認してください。

$ ls -l /usr/lib/systemd/system/[email protected]
-rw-r--r-- 1 root root 1958 Apr  9 00:22 /usr/lib/systemd/system/[email protected]
$ grep ^ExecStart /usr/lib/systemd/system/[email protected]
ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear %I $TERM
$ systemctl -t service --state running list-units | grep getty
[email protected]       loaded active running Getty on tty1 

関連情報