私の問題:
bashスクリプトを作成していて、その中で特定のサービスが実行されているかどうかを確認したいと思います。
$ service [service_name] status
を使用して、これを手動で行う方法を知っています。 。
しかし(特にsystemdに移行してから)、解析するのが少し面倒な大量のテキストを印刷します。簡単な出力または確認できる戻り値を持つスクリプト用に作成されたコマンドがあると思いました。
しかし、グーグルで回ると、「ああ、ps aux | grep -v grep | grep [service_name]
" 結果。それはベストプラクティスではありませんね。そのコマンドの別のインスタンスが実行されているが、SysV initスクリプトによって開始されたものではない場合はどうなりますか?
それとも、黙って小さなpgrepで手を汚す必要がありますか?
承認された回答:
systemctl
is-active
があります このためのサブコマンド:
systemctl is-active --quiet service
service
の場合、ステータスはゼロで終了します はアクティブで、それ以外の場合はゼロ以外であるため、スクリプトに最適です:
systemctl is-active --quiet service && echo Service is running
--quiet
を省略した場合 また、現在のステータスを標準出力に出力します。
don_crisstiが指摘しているように、サービスを提供するために何も実行されていなくても、一部のユニットはアクティブになる可能性があります。「RemainAfterExit」とマークされたユニットは、正常に終了するとアクティブと見なされます。デーモンを必要としないサービスを提供するという考え方です。 (例 それらはシステムのいくつかの側面を構成します)。ただし、デーモンを含むユニットは、デーモンがまだ実行されている場合にのみアクティブになります。