一連のサービス間の相互排他性

一連のサービス間の相互排他性

一連のシステムサービスがあります。これをA.service、、B.serviceおよびC.serviceと呼びますD.service

どのサービスでも実行すると他のサービスを妨げる可能性があるため、指定した時間に4つのサービスのうちの1つだけを実行できるようにスケジュールしたいと思います。

どうすればいいですか?これが最善の方法ですか?

詳細と意見

  • すべてのサービスは長期間実行されますType=oneshot

  • サービスの順序は重要ではありません。

  • サービスの単位ファイルを変更できます。

  • 最善の解決策はさまざまなサービスで機能する必要があります。

  • 最適には、このソリューションは、サービスがタイマーとして実行され、起動時に開始され、手動で開始される場合に機能するはずです。しかし、タイマーとしてのみ機能するソリューションも興味深いです。

  • Bがすでに実行されているとき(タイマーを介してまたは手動で)Aが開始されている場合、AはBが完了するのを待ってからAを開始する必要があります。

  • 他のサービスの前後に各サービスを宣言すると、問題を解決できます。しかし、まだこれを行う方法が見つかりませんでした。また、非常に混乱する可能性があり、より多くのサービスに拡張されません。

  • おそらく、問題は「スライシング」とリソース制御を使用して何らかの方法で解決できますが、方法を知ることはできません。

  • TasksMax=1サービスではなくスレッドを数えるので間違っているようです。

  • 開始したい他のサービスによって、あるサービスが動作するように停止したくありませんConflicts=

  • 最善の解決策は、MutualExclution=my-exclution-tag同じラベルを持つ単一のユニットのみを同時に実行するように、ユニットファイルに仮想エントリを追加することです。しかし、そのような単位ファイルエントリは存在しないようです。

答え1

systemdには、あなたが説明する非常に具体的な意味をサポートするツールが組み込まれていないと思いますが、ロックファイルを使用すると、必要なものを簡単に得ることができるようです。各サービスに対して実行するのではなく、/some/script/or/program次の呼び出しでラップしますflock

ExecStart = /usr/bin/flock /tmp/my-exclusion-lock /some/script/or/program

サービスが実行されている場合、他のサービスはロックを獲得しようとする試みをブロックします。実行中のサービスが終了すると、ロックが解除され、待機中のサービスの1つが実行を開始します。

関連情報