2014-01-31 6 views
9

Ich habe ein Bash-Skript, das einen Dienst im Hintergrund startet. Nachdem dieser Dienst erfolgreich gestartet wurde, wird "Server is active" an die Standardausgabe ausgegeben. Ich muss warten, bis diese Zeichenfolge angezeigt wird und dann mein Skript weiter ausführen. Wie kann ich das erreichen?Warten Sie, bis der Dienst im Bash-Skript startet

+1

Tun Sie das nicht. Machen Sie Ihr Skript selbst zu einem Dienst. Dann kann es davon abhängen, ob Sie 'systemd' oder einfach alte SysV init .... –

+1

Oder einfach nur eine Sperrdatei beim Start, oder überprüfen Sie pid, oder etwas anderes, keinen Grund,' stdout 'hier zu erfassen. – BroSlow

Antwort

7

Ich würde auf diese Weise tun.

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

echo Continue 

Hier -m1 erzählt grep(1) im ersten Spiel zu beenden.

veryfied ich meine Antwort mit meinem Spielzeug „Service“ unter:

#! /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 

Wenn Sie echo Continue mit echo Continue; sleep 1; ls /tmp/server-msg.txt ersetzen, werden Sie ls: cannot access /tmp/server-output.txt: No such file or directory sehen, die die „Weiter“, wurde direkt nach der Ausgabe von Server is active ausgelöst Aktion beweist.

0

Für mich Service Status als zu service App zu lesen:

$ /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 

und es kann mit dem Code erfolgen:

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 
0

Sind Sie stderr nach stdout umleiten zu fragen?

./yourscript.sh 2>&1 |grep "Server is active" && echo "continue executing my script" 
Verwandte Themen