システムターゲットに他のターゲットのサービスを停止させるにはどうすればよいですか?

システムターゲットに他のターゲットのサービスを停止させるにはどうすればよいですか?

systemd複数のターゲットが欲しいです。TargetA、、、、、TargetB呼び出して一連のTargetCサービスを制御します。構成は次のとおりです。Service01Service7

  • TargetA
    • Service1
    • Service2
    • Service3
  • TargetB〜したい
    • Service3
    • Service4
    • Service5
  • TargetC〜したい
    • Service5
    • Service6
    • Service7

ターゲット:

  • 一度に1つのターゲットのみを有効にできます。
  • システム管理者は、自由に手動で起動してサービスできる必要があります。

私の初期設定には以下が含まれます。

  • 各目標は他の2つの目標と衝突します。
  • すべてのサービスがStopWhenUnneeded=true有効になっています。

これは最初の要件を満たします。最初は2つの追加目標がブロックされましたTargetX。残念ながら、この設定はシステム管理者を制限します。システム管理者がsudo systemctl start ServiceXサービスを実行すると、サービスが開始されている必要はないため、すぐに終了します。

2番目の設定には以下が含まれます。

  • 各目標は他の2つの目標と衝突します。
  • 各ターゲットは不要なサービスとも競合します。
  • 利用可能なサービスはありません。StopWhenUnneeded=true

たとえば、

  • TargetA
    • 〜したい
      • Service1
      • Service2
      • Service3
    • 紛争
      • Service4
      • Service5
      • Service6
      • Service7
      • TargetB
      • TargetC

これは所望の効果を得ることができなかった。私が実行した場合:

sudo systemctl start TargetA.target

以下は:

sudo systemctl start TargetB.target

それからTargetA.target停止しましたが(はい!)Service1まだService2実行中です。

私は何を得られませんでしたか?systemd私が望む行動をどのように得ることができますか?

答え1

推奨方法:

  1. systemctl isolate3つのターゲットをそれぞれ発射するために使用されます。これは、「isolateコマンドは、現在使用中のグラフィック環境または端末を含む可能性のある新しいデバイスでアクティブでないプロセスをただちに停止します。」で説明されているようにman systemctl強力なコマンドです。multi-user.target依存関係として含めることができます。
  2. ターゲットから開始した最初のサービスが、他のターゲットが有効になっていることを確認する特別なサービスであることを確認してください。これにより、管理者がカスタムターゲットを「分離」するのではなく、誤って「実行」するのを防ぎます。これを使用して、/bin/systemctl is-active your.target「アクティブ」を返すかどうかをすばやく確認できます。

関連情報