複数のプロセスを必要とする systemd サービスを管理するにはどうすればよいですか?

複数のプロセスを必要とする systemd サービスを管理するにはどうすればよいですか?

いくつかのプロセス (python、node など) を実行する必要がある Web サイトがあります。現在、systemd サービスを作成しているので、それらのプロセスを簡単に開始および停止できます。必要なすべてのプロセスをバックグラウンド プロセスとして起動する開始スクリプトを作成しました (&コマンドの末尾に追加)。

これにより、すべてのプロセスが単一のスクリプトで開始されるため、何かがクラッシュしたときに systemd の自動再起動機能を利用できなくなります。

私が考えられる 1 つの解決策は、各プロセスにサービスを作成し、それらをすべてリンクするマスター サービスを作成することですRequires。この方法は、実行したいこの Web サイトの各環境ごとに 4 ~ 5 個のサービスを作成する必要があるため、あまり好きではありません。

複数のプロセスを開始し、それぞれを個別に監視するサービスを簡単に定義する方法はありますか?

答え1

複数作成するテンプレートサービスには、@次のような名前が付けられます。

テンプレートを使用すると、各 Web サイトの名前付きインスタンスを開始できます。

systemctl start [email protected] [email protected]
systemctl start [email protected] [email protected]

このようなテンプレート ユニット内では、%iを使ってインスタンス名 (この例では「clientone」) を参照できます。したがって、「メイン」ユニット (サービスまたはターゲット) には次のものが含まれます。

[Unit]
Requires=pythonthingy@%i.service
...
[Service]
Environment="DOCROOT=/var/www/%i"

各サイトに複数のパラメータが必要な場合は、ファイルから読み込むことができます。

[Service]
EnvironmentFile=/etc/someconfigdir/%i.conf

一部のサイトで他のサイトと比較して非標準の単位設定が必要な場合は、ドロップインを使用します。

テンプレート、ドロップイン、%iのような拡張については、systemd.ユニット(5)

関連情報