サービスファイルでサービス名を動的に設定する方法はありますか?
異なる入力パラメータを使用してサービスの複数のインスタンスを実行しています。デバッグの場合、すべてのサービスが同じように呼び出され、実際に苦情を申し立てるサービスを見つけるのは面倒である可能性があるため、これは最適ではありません。だから私が望むのは、与えられた入力に対してサービスに一意の名前を付けることです。 Systemdsサービスファイルは、ExecStart
arg [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