web-dev-qa-db-ja.com

複数のプロセスを必要とするsystemdサービスを管理する方法は?

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

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

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

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

3
Jesse

次のような@で名前が付けられたいくつかのtemplateサービスを作成します。

テンプレートを使用して、各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.unit(5) で説明しています。

3
user1686