異なる引数で複数のサービスを実行する

異なる引数で複数のサービスを実行する

サービスとして実行したいデータを処理する Python スクリプトを作成しました。スクリプトはデータを処理した後、しばらくスリープ状態になって、入ってくる新しいデータを処理します。

私の問題は、処理したいデータ ソースがいくつかあり、スクリプトが一度に 1 つのデータ ソースを処理するように作成されているため、サービスのインスタンスを複数実行したいということです。

これを行うにはいくつかの方法があります:

すべてのデータ ソースを処理するようにスクリプトを書き直すこともできますが、これにより、アドホックな使用には使用できなくなり、追加または削除されたソースを自動検出できないため、データ ソース セットの更新が難しくなります。したがって、可能ではありますが、これは最も好ましくないオプションです。

処理したいデータ ソースのスクリプトを開始するラッパー スクリプトを bash または python で作成することもできます。これも少し不格好な気がします。

各データ ソースに対して 1 つのユニット ファイルを作成し、それぞれが適切な引数を使用して処理スクリプトを呼び出すと、processing_ds1.system、processing_ds2.system などのシステム ファイルがいくつか作成されます。これを行わない正当な理由がない限り、これは可能な方法のように思えます。

私が好む方法は、各データ ソースの引数を指定して呼び出すことができるか、システム ファイル内のすべてのインスタンスを開始できる 1 つのシステム ファイルを作成することです。

そこで、2つの選択肢があります。

ユニットファイルで引数を使用するにはどうすればいいでしょうか? postgresqlは@を使用して異なるバージョンを起動できることがわかりました。

systemctl start postgres@12-main

クラスター 12-main を起動します。しかし、これはどのように行うのでしょうか? postgresql 用の実用的なユニット ファイルが見つかりません。

または

1 つのユニット ファイルから複数のサービスを開始することは可能でしょうか。また、お勧めでしょうか。

答え1

テンプレート ユニット ファイルを使用できます。システムユニット

OpenVPN を例にとると、次の内容で、[email protected]名前の付いたユニット ファイルを作成できます。/etc/systemd/system

[Unit]
Description=OpenVPN connection to %i
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

systemdを実行するたびに、 systemctl start openvpn@myconfig ユニットファイル内の %i が "myconfig" に置き換えられます。そのため、/usr/sbin/openvpn --config /etc/openvpn/myconfig.conf を実行します。

関連情報