私の問題:
私は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
がアクティブな場合はステータス0で終了し、それ以外の場合はゼロ以外で終了するため、スクリプトに最適です。
systemctl is-active --quiet service && echo Service is running
--quiet
を省略すると、現在のステータスが標準出力に出力されます。
don_crissti で指摘されているように、サービスを提供するために何も実行されていなくても、一部のユニットはアクティブである可能性があります。デーモンは必要ありません(egシステムの一部の側面を構成します)。ただし、デーモンを含むユニットは、デーモンがまだ実行されている場合にのみアクティブになります。
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 "=".
ザナの答えを補完するものとして、--value
オプションsystemctl show
は systemdのバージョン2 で導入されました。そのため、debian jessieなどの特定のディストリビューションでは利用できない場合があります。
この場合、sedを使用してオプションをエミュレートできます。
$ systemctl show -p ActiveState sshd | sed 's/ActiveState=//g'
active
$ systemctl show -p SubState sshd | sed 's/SubState=//g'
running
パーティーには遅すぎますが、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 "
これはコマンドラインの実行やスクリプトを作成する場合に便利です。
@StephenKittからコピー
これにより、サービスが停止しているかどうかが確認され、サービスの再起動が実行されます
systemctl is-active --quiet <service name> || <service name> restart
||
著者が説明したようにアクティブでない場合、systemctlからの戻り値がゼロ以外の意味であるかどうかがチェックされます。
systemctl
を使用して多くの答えがあります。
他のオプションもあります($?
が便利です):
pidof redis-server
を発行し、次に$?
の値を確認します。実行中の場合は0が見つかります。それ以外の場合はゼロ以外。redis-service
の例では、サービスが実行されている場合、redis-cli ping
コマンドに対するPONG応答が返されます。 redis-cli ping
を発行した後、$?
を確認し、0の場合はサービスが実行されています。Oxmelの回答のようにsedコマンドを使用する代わりに、照会するすべての種類のプロパティにcut -d'=' -f 2
を使用するだけで十分です。
例えば:
$ systemctl show -p ActiveState sshd | cut -d'=' -f2
active
$ systemctl show -p SubState sshd | cut -d'=' -f2
running
システム化されていない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
こちら からこの回答を得ました。