マルチインスタンスLSBスクリプトをsystemdに移行するには?

マルチインスタンスLSBスクリプトをsystemdに移行するには?

私はデーモンの複数のインスタンスを管理するLSB initスクリプトを作成しました。すべてのインスタンスを起動し(rcfoo start一部の構成ファイルにあり)、すべてのインスタンスを停止し、すべてのインスタンスの状態を表示し、変更された構成プロセスでデーモンを再ロードして更新します。/etcrcfoo stoprcfoo statusrcfoo reload

[email protected]まず、一部のシステム単位ファイルで使用するインスタンスを検出する方法を知りたいと思います。 AFAIKなどのすべてのインスタンスを指定する必要がありますfoo@Afoo@B

次に、私のLSBスクリプトは拡張ステータスを報告できます。つまり、reloadサービスが必要かどうかを表示できます(reload実際には、LSBスクリプトは必要なサービスのみを再ロードするように最適化されています)。カスタムステータスレポートを作成するにはどうすればよいですか?systemd-notifyステータスメッセージをカスタマイズするにはスクリプトを使用する必要があると思います。

幸いなことに、単一のインスタンスにタスクを追加することで、LSBスクリプトの最終拡張single <instance>(例rcfoo start single A:)がsystemdでデフォルトでサポートされています。

だから私の基本的な質問は質問1番です。

答え1

2つの可能な解決策が見つかりました。

  1. インスタンス引数とコマンド引数を受け入れる「ラッパースクリプト」を作成します。その後、スクリプトは、要求されたインスタンスが実際に設定ファイルに見つかったかどうかを検索する必要があります/etc。スクリプトは、実際には、、およびstartstop提供しreloadますが、デーモンプロセスのPIDはを介してsystemdによって処理されますPIDFile=

    [email protected]また、などのラッパースクリプトを含むサービスユニットを作成します。インスタンス名がここに表示されます。あまり良くないという事実は、インスタンス名を知る必要があり、無効なインスタンス名が使用されている場合、systemdは繰り返し再起動する非アクティブインスタンスを作成することです(手動クリーンアップが使用されるまで)。この方法は条件付き再起動の問題を解決しません。そうなるでしょう。ExecStart=ExecStop=%isystemctl reset-failedsystemctl start foo@A

  2. あるいは、構成ファイルを読み取り、見つかった各インスタンスのサービスインスタンス単位ファイルを生成するジェネレータを作成して、ラッパースクリプトを削除することもできます。使用されるコマンドラインは、設定ファイルを使用してジェネレータによって組み立てられます。ジェネレータは、追加ExecStartPre=のシェルコマンドを渡して追加します(たとえば、ランタイムディレクトリの作成またはデーモンフォークが完了するのを待ちます)ExecStartPost=

    まだ解決する必要があるいくつかの問題がありますが、開発リストに表示されるsystemdコミュニティは実際には役に立ちません。彼らはジェネレータが高度な概念であると言います。私はそれを使うべきではありません。、実際に私の質問に答えません。

この回答に欠けている内容は次のとおりです。すべてのサービスを開始および停止するsytemdターゲットをどのように構成しますか? 1つぐらいあればいいと思っていましたが、起動時に失敗しました(不明な理由で結果のユニットファイルが空です)。

関連情報