システム動的(ランタイム)依存関係

システム動的(ランタイム)依存関係

組み込みデバイスには基本的なアプリケーションと複数のサービスがあります。主なアプリケーションとサービスはsystemdによって管理されます。

デフォルトアプリケーションにはプラグインシステムがあり、そのプラグインは実行時に有効または無効にできます。私たちが持っているとしPluginAましょうPluginB。どちらのプラグインもサービスが必要です。これをと呼びますServiceP

プラグインが1つしかない場合は、ロード中にServicePサービスを開始し、アンロード中にサービスを停止します。ただし、2つのプラグインがあり、ライフサイクルが重複する可能性があるため、動的依存関係または参照カウンタが必要です。

PluginA loaded   --> start ServiceP
PluginB loaded   --> do nothing (already started by PluginA)
PluginA unloaded --> do nothing (still required by PluginB)
PluginB unloaded --> stop ServiceP

systemdを使ってこれを行う方法はありますか?

私はそうは思わない。なぜなら、systemdはアプリケーション全体を管理するからです。したがって、参照カウンタを直接実装すると、次のような結果が得られます。

# case 1
App starts (don't start ServiceP, app didn't request it yet)
App says it needs ServiceP --> start ServiceP
App says it no longer needs ServiceP --> stop ServiceP

# case 2
App says it needs ServiceP --> start ServiceP
App stops/crashes --> stop ServiceP
...

ユニットファイルに依存関係を追加/削除して再ロードすると、簡単に達成できると思います。ただし、App衝突が発生しても停止しないため、ServicePでクリーンアップを行う必要がありますExecStopPost=。これはsystemctl daemon-reloadユニットファイルから呼び出すことを意味しますが、これは正しくないようです。より良い解決策はありますか?

ベストアンサー1

おすすめ記事