systemd
複数のターゲットが欲しいです。TargetA
、、、、、TargetB
呼び出して一連のTargetC
サービスを制御します。構成は次のとおりです。Service01
Service7
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
推奨方法:
systemctl isolate
3つのターゲットをそれぞれ発射するために使用されます。これは、「isolateコマンドは、現在使用中のグラフィック環境または端末を含む可能性のある新しいデバイスでアクティブでないプロセスをただちに停止します。」で説明されているようにman systemctl
強力なコマンドです。multi-user.target
依存関係として含めることができます。- ターゲットから開始した最初のサービスが、他のターゲットが有効になっていることを確認する特別なサービスであることを確認してください。これにより、管理者がカスタムターゲットを「分離」するのではなく、誤って「実行」するのを防ぎます。これを使用して、
/bin/systemctl is-active your.target
「アクティブ」を返すかどうかをすばやく確認できます。