私はデーモンの複数のインスタンスを管理するLSB initスクリプトを作成しました。すべてのインスタンスを起動し(rcfoo start
一部の構成ファイルにあり)、すべてのインスタンスを停止し、すべてのインスタンスの状態を表示し、変更された構成プロセスでデーモンを再ロードして更新します。/etc
rcfoo stop
rcfoo status
rcfoo reload
[email protected]
まず、一部のシステム単位ファイルで使用するインスタンスを検出する方法を知りたいと思います。 AFAIKなどのすべてのインスタンスを指定する必要がありますfoo@A
。foo@B
次に、私のLSBスクリプトは拡張ステータスを報告できます。つまり、reload
サービスが必要かどうかを表示できます(reload
実際には、LSBスクリプトは必要なサービスのみを再ロードするように最適化されています)。カスタムステータスレポートを作成するにはどうすればよいですか?systemd-notify
ステータスメッセージをカスタマイズするにはスクリプトを使用する必要があると思います。
幸いなことに、単一のインスタンスにタスクを追加することで、LSBスクリプトの最終拡張single <instance>
(例rcfoo start single A
:)がsystemdでデフォルトでサポートされています。
だから私の基本的な質問は質問1番です。
答え1
2つの可能な解決策が見つかりました。
インスタンス引数とコマンド引数を受け入れる「ラッパースクリプト」を作成します。その後、スクリプトは、要求されたインスタンスが実際に設定ファイルに見つかったかどうかを検索する必要があります
/etc
。スクリプトは、実際には、、およびstart
をstop
提供しreload
ますが、デーモンプロセスのPIDはを介してsystemdによって処理されますPIDFile=
。[email protected]
また、などのラッパースクリプトを含むサービスユニットを作成します。インスタンス名がここに表示されます。あまり良くないという事実は、インスタンス名を知る必要があり、無効なインスタンス名が使用されている場合、systemdは繰り返し再起動する非アクティブインスタンスを作成することです(手動クリーンアップが使用されるまで)。この方法は条件付き再起動の問題を解決しません。そうなるでしょう。ExecStart=
ExecStop=
%i
systemctl reset-failed
systemctl start foo@A
あるいは、構成ファイルを読み取り、見つかった各インスタンスのサービスインスタンス単位ファイルを生成するジェネレータを作成して、ラッパースクリプトを削除することもできます。使用されるコマンドラインは、設定ファイルを使用してジェネレータによって組み立てられます。ジェネレータは、追加
ExecStartPre=
のシェルコマンドを渡して追加します(たとえば、ランタイムディレクトリの作成またはデーモンフォークが完了するのを待ちます)ExecStartPost=
。まだ解決する必要があるいくつかの問題がありますが、開発リストに表示されるsystemdコミュニティは実際には役に立ちません。彼らはジェネレータが高度な概念であると言います。私はそれを使うべきではありません。、実際に私の質問に答えません。
この回答に欠けている内容は次のとおりです。すべてのサービスを開始および停止するsytemdターゲットをどのように構成しますか? 1つぐらいあればいいと思っていましたが、起動時に失敗しました(不明な理由で結果のユニットファイルが空です)。