GNU/Linux >> Linux の 問題 >  >> Linux

bash-script でサービスが開始されるまで待ちます

service に関するサービスのステータスを読み取るには アプリ:

$ /sbin/service network status
network.service - Network Connectivity
   Loaded: loaded (/lib/systemd/system/network.service; enabled)
   Active: active (exited) since Ср 2014-01-29 22:00:06 MSK; 1 day 15h ago
  Process: 15491 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS)

$ /sbin/service httpd status 
httpd.service - SYSV: Apache is a World Wide Web server.  It is used to serve HTML files and CGI.
   Loaded: loaded (/etc/rc.d/init.d/httpd)
   Active: activating (start) since Пт 2014-01-31 13:59:06 MSK; 930ms ago

これは次のコードで実行できます:

function is_in_activation {
   activation=$(/sbin/service "$1" status | grep "Active: activation" )
   if [ -z "$activation" ]; then
      true;
   else
      false;
   fi

   return $?;
}

while is_in_activation network ; do true; done

grep -q を使用 . -q オプションは grep になります 静かで、テキストが表示されるとすぐに終了します。

以下のコマンドは ./some-service を開始します

(./some-service &) | grep -q "Server is active"

私ならこうします。

./server > /tmp/server-log.txt &
sleep 1
while ! grep -m1 'Server is active' < /tmp/server-log.txt; do
    sleep 1
done

echo Continue

こちら -m1 grep(1) に伝えます 最初の試合で終了します。

以下のおもちゃの「サービス」で答えを検証しました:

#! /bin/bash

trap "echo 'YOU killed me with SIGPIPE!' 1>&2 " SIGPIPE

rm -f /tmp/server-output.txt
for (( i=0; i<5; ++i )); do
    echo "i==$i"
    sleep 1;
done
echo "Server is active"
for (( ; i<10; ++i )); do
    echo "i==$i"
    sleep 1;
done
echo "Server is shutting down..." > /tmp/server-output.txt

echo Continue を置き換えると echo Continue; sleep 1; ls /tmp/server-msg.txt で 、 ls: cannot access /tmp/server-output.txt: No such file or directory が表示されます Server is active の出力の直後に「続行」アクションがトリガーされたことを証明します .


Linux
  1. フレームバッファデバイスでテキストコンソールを開始するSystemdサービスはどれですか?

  2. Linux OS サービス「dhcpd」

  3. Linux OS サービス「anacron」

  1. Linux OS サービス「iptables」

  2. Linux OS サービス「ネットワーク」

  3. Linux OS サービス「ポートマップ」

  1. Linux OS サービス「auditd」

  2. Linux OS サービス「nfs」

  3. Linux OS サービス「microcode_ctl」