サービスがスクリプトで実行されているかどうかをテストする「正しい」方法

サービスがスクリプトで実行されているかどうかをテストする「正しい」方法

私の質問:

指定されたサービスが実行されていることを確認するbashスクリプトを作成しています。

を使用して手動で行う方法を知っています$ service [service_name] status

ただし、(特にsystemdに切り替えた後)、解析するために少し混乱している多くのテキストが印刷されます。単純な出力または確認できる戻り値を持つスクリプトに対するコマンドがあるとします。

しかし、Googleで検索すると「ああ、ただ」という結果がたくさん出ますps aux | grep -v grep | grep [service_name]。それはベストプラクティスではありませんか?コマンドの他のインスタンスが実行されているがSysV initスクリプトによって起動されたインスタンスではない場合はどうなりますか?

それとも、ちょうど黙って少しpgrepで手を汚す必要がありますか?

ベストアンサー1

systemctl一つあるis-activeこれに対するサブコマンド:

systemctl is-active --quiet service

アクティブな場合はステータス0で終了し、serviceそれ以外の場合はゼロ以外で終了するため、スクリプトに最適です。

systemctl is-active --quiet service && echo Service is running

省略すると、--quiet現在の状態も標準出力に出力されます。

一部のユニットは、サービスを提供するために実行されているものが何もなくてもアクティブになることがあります。 「RemainAfterExit」と表示されたユニットは、正常に終了するとアクティブと見なされます。アイデアは、デーモンが不要なサービスを提供することです(例えばシステムの特定の側面を構成します。ただし、デーモンに関連するデバイスは、デーモンが継続して実行されている間にのみアクティブになります。

使い捨てデバイスいいえ「RemainAfterExit」はアクティブなユニット状態に入らないため、is-activeこれらのユニットの処理に成功しません。is-activeテキスト出力を解析できます。

systemctl is-active service

現在実行中の使い捨てデバイスについては「有効」、現在実行中ではないが最後に正常に実行された(ある場合)使い捨てデバイスについては「無効」、現在実行されていない使い捨てデバイスについては「失敗」を出力します。実行中で、最後に実行したときに失敗しました。is-activeこれらのユニットは常にゼロ以外の状態を返すので、次のように実行します。

systemctl is-active service ||:

必要に応じて無視してください。

おすすめ記事