一連のシステムサービスがあります。これを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つが実行を開始します。