組み込みデバイスには基本的なアプリケーションと複数のサービスがあります。主なアプリケーションとサービスは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
ユニットファイルから呼び出すことを意味しますが、これは正しくないようです。より良い解決策はありますか?