同じターゲットに属するすべてのユニットをブロックする方法は?

同じターゲットに属するすべてのユニットをブロックする方法は?

同じターゲットにグループ化されたすべてのユニットを停止する方法を知りたいです。

私の設定は次のとおりです。次の内容を含む複数のデバイス構成ファイルがあります。

[Unit]
...

[Service]
...

[Install]
WantedBy=mycustom.target

私が走るとき

# systemctl start mycustom.target

「必須」単位はmycustom.target正しく開始されます。今、あなたが望むすべてのユニットをブロックできるようになれば幸いですmycustom.target。私は試した:

# systemctl stop mycustom.target

しかし、これはうまくいきません。同じターゲットが(明示的に)必要なすべてのユニットを停止せずにこれを行う方法はありますか?

答え1

指示を使用してくださいPartOf=

依存関係の設定はRequires =に似ていますが、デバイスを停止して再起動することに制限されています。 systemdがここにリストされているデバイスを停止または再起動すると、ジョブはそのデバイスに伝播されます。これは一方向の依存関係です。このデバイスを変更しても、リストされているデバイスには影響しません。

PartOf=mycustom.target

答え2

編集:PartOf=この回答を書くときに存在しなかったディレクティブは、より良い解決策です。詳しくは他の回答をご覧ください。

暗黙的な方法と明示的な方法の2つの方法があります。

最初の方法——StopWhenUnneeded=

最初の方法は次のとおりです。StopWhenUnneeded=指示する。ユニットにこの機能がある場合、StopWhenUnneeded=yesそのユニットのアクティブユニットがもう存在しない場合は自動的に停止します。したがって:Wants=Requires=

  • これらのユニットがある場合にのみWantedBy= ただ合格mycustom.target
  • これらのデバイスは手動で起動できません(systemctl start myunit.serviceつまり、起動後すぐに停止します)。

2番目の方法 - シェルパイプライン

2番目の方法は、systemctl show -p抽出用の単純なシェルパイプラインを設定することですmycustom.target

もっと具体的にsystemctl show UNIT見せるとみんなセルのプロパティをKEY = VALUEとしてマークし、systemctl show -p PROPERTIES UNIT同じ操作を実行して表示されるプロパティのセットを制限します。だから:

systemctl stop -- $(systemctl show -p Wants mycustom.target | cut -d= -f2)

関連情報