web-dev-qa-db-ja.com

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

私の問題:

私はbashスクリプトを書いており、その中で特定のサービスが実行されているかどうかを確認したいと思います。

私はこれを手動で行う方法を知っています、$ service [service_name] status

しかし、(特にsystemdへの移行以降)解析するのが少し面倒なテキスト全体を出力します。簡単な出力または確認できる戻り値を持つスクリプト用に作成されたコマンドがあると想定しました。

しかし、グーグル操作を行うと、「ああ、ps aux | grep -v grep | grep [service_name] "の結果。これはベストプラクティスにはなりません。そうですか?そのコマンドの別のインスタンスが実行されているが、SysV initスクリプトによって開始されていない場合はどうなりますか?

それとも私はただ黙って、小さなpgrepで私の手を汚すべきですか?

126
Nick S

systemctlには、このための is-active サブコマンドがあります。

systemctl is-active --quiet service

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

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

--quietを省略すると、現在のステータスが標準出力に出力されます。

don_crissti で指摘されているように、サービスを提供するために何も実行されていなくても、一部のユニットはアクティブである可能性があります。デーモンは必要ありません(egシステムの一部の側面を構成します)。ただし、デーモンを含むユニットは、デーモンがまだ実行されている場合にのみアクティブになります。

180
Stephen Kitt

systemctlには、スクリプトに適したモードがあります。 showではなくstatusを使用し、-p/--propertiesおよび--valueオプションを追加して、必要な出力のみを取得します。

次に例を示します(Ubuntu 17.04システムから):

$ systemctl show -p SubState --value NetworkManager
running

実行中(またはそれ以外)はSubStateです。サービスがアクティブかどうかを知りたい場合は、プロパティActiveStateを使用します

$ systemctl show -p ActiveState --value x11-common
inactive
$ systemctl show -p SubState --value x11-common
dead

manからのメモ:

show [PATTERN...|JOB...]
           Show properties of one or more units, jobs, or the manager
           itself. If no argument is specified, properties of the
           manager will be shown. If a unit name is specified, properties
           of the unit are shown, and if a job ID is specified,
           properties of the job are shown. By default, empty properties
           are suppressed. Use --all to show those too. To select specific
           properties to show, use --property=. This command is intended
           to be used whenever computer-parsable output is required. Use
           status if you are looking for formatted human-readable output.

-p, --property=
           When showing unit/job/manager properties with the show command,
           limit display to properties specified in the argument. The
           argument should be a comma-separated list of property names,
           such as "MainPID". Unless specified, all known properties are
           shown. If specified more than once, all properties with the
           specified names are shown. Shell completion is implemented for
           property names.

--value
           When printing properties with show, only print the value, and
           skip the property name and "=".
40
Zanna

ザナの答えを補完するものとして、--valueオプションsystemctl showsystemdのバージョン2 で導入されました。そのため、debian jessieなどの特定のディストリビューションでは利用できない場合があります。

この場合、sedを使用してオプションをエミュレートできます。

$ systemctl show -p ActiveState sshd | sed 's/ActiveState=//g'
active
$ systemctl show -p SubState sshd | sed 's/SubState=//g'  
running
14
Oxmel


パーティーには遅すぎますが、systemctlを&&および||とともにスクリプトで使用すると、常にそうなるとは限りません。以下はTomcatに使用したものですが、複数のサービスをチェックする必要があるがここでは範囲外である場合は、引数を取るメソッドで使用し、サービス名を引数として渡すことができます。

STATUS="$(systemctl is-active Tomcat.service)"
if [ "${STATUS}" = "active" ]; then
    echo "Execute your tasks ....."
else 
    echo " Service not running.... so exiting "  
    exit 1  
fi

これが私が利用した方法です。

そして、シンプルで簡単なもののために、ここで説明されている他のものに従ってください:

systemctl -q is-active Tomcat.service  && \
echo "Tomcat Runnung" || \
echo "Service is not running at all "
5
SAGAR Nair

これはコマンドラインの実行やスクリプトを作成する場合に便利です。

@StephenKittからコピー

これにより、サービスが停止しているかどうかが確認され、サービスの再起動が実行されます

systemctl is-active --quiet <service name> || <service name> restart

||著者が説明したようにアクティブでない場合、systemctlからの戻り値がゼロ以外の意味であるかどうかがチェックされます。

5
asterisk

systemctlを使用して多くの答えがあります。

他のオプションもあります($?が便利です):

  • Pidofコマンドの使用:redis-serverが実行されているかどうかを確認しようとしているとします。最初にpidof redis-serverを発行し、次に$?の値を確認します。実行中の場合は0が見つかります。それ以外の場合はゼロ以外。
  • サービス固有のソリューション:サービスがサービスが実行されているかどうかを確認する方法を提供する場合は、それを使用できます。 redis-serviceの例では、サービスが実行されている場合、redis-cli pingコマンドに対するPONG応答が返されます。 redis-cli pingを発行した後、$?を確認し、0の場合はサービスが実行されています。
2
Tuhin Paul

Oxmelの回答のようにsedコマンドを使用する代わりに、照会するすべての種類のプロパティにcut -d'=' -f 2を使用するだけで十分です。

例えば:

$ systemctl show -p ActiveState sshd | cut -d'=' -f2
active
$ systemctl show -p SubState sshd | cut -d'=' -f2
running
2
Mauri

システム化されていないOSでも機能します。

ps -C service-name?小切手 $?回答。 0実行されている場合、1、実行されていません。

例:

ps -C privoxy && echo running

静かなバージョン:

ps -C privoxy 1>/dev/null && echo running

警告

14文字を超えるサービス名は誤検知を引き起こす可能性があることに気付きました。

また、 '' Nick S ''のコメントも参照してください。

例:

実行中を正しく示します:

$ ps -C notification-daemon
  PID TTY          TIME CMD
 7418 ?        00:00:04 notification-da

誤って実行を示しています:

$ ps -C notification-daemon-fake
  PID TTY          TIME CMD
 7418 ?        00:00:04 notification-da

14文字未満であるため、実行されていないことが正しく表示されます。

$ ps -C notification
  PID TTY          TIME CMD

こちら からこの回答を得ました。

0
ajnabi