web-dev-qa-db-ja.com

systemctlは、ユニット(サービスまたはターゲット)が存在するかどうかを確認します

特定のsystemdユニットが存在するかどうかを知りたいです。

これは動作するはずです:

  • 任意のタイプのユニット(サービス、ターゲット、マウントなど)
  • 実行中、無効、またはマスクされたユニット

私はこれを行うことができることを知っています:

systemctl list-unit-files | grep "^my.target"

しかし、もっと良い方法が必要だと感じています。

オプションで、 "-service"(他のsystemctlコマンドのように)を指定する必要なしにmyを指定するだけでこのチェックを実行できるようにしたいと思います。

systemctl exists my
3
Chris Maes

私はそれを行うためのネイティブのsystemd方法を知りませんが、systemctl list-unit-filesを(ab)使用することができます。

systemctl-exists() {
  [ $(systemctl list-unit-files "${1}*" | wc -l) -gt 3 ]
}

これにより、次のように使用できる「テスト」関数が作成されます。

systemctl-exists my && echo my exists as a systemd unit

*サフィックスは、systemdが指定された引数を任意の「タイプ」(サービス、ターゲット、またはマウント)と照合できるようにするためのものです。この関数は、少なくとも3行の出力を含む現在のsystemctl list-unit-files出力にハードコード化されています(一致するユニットが存在しない場合)。一致する単位がある場合はさらに:

1. UNIT FILE            STATE
   (one or more matching unit files)
2. (a blank line)
3. "%d unit files listed."

同様の接頭辞が付いたユニットファイルがある場合、末尾のワイルドカードが誤検知につながる可能性があることにも注意してください。本物の「au.service」。ご存知の場合は、サービス名を詳しく説明してください:systemctl-exists au.serviceは正しいことを行います。

最初はsystemctl catがフィルターとして機能すると思っていましたが、引数がserviceであることを想定しているため、他のタイプ(ターゲットやマウントなど)には適切にフィルターされません。

2
Jeff Schaller