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
9
A
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
- 1. So warten Sie, bis der Systembefehl endet
- 2. Warten Sie, bis der Prozess beendet ist
- 3. Warten Sie, bis ein Prozess
- 4. Warten bis Text vorhanden im Textfeld
- 5. Dienst startet nicht
- 6. Warten Sie, bis alle Threads im Service fertig sind.
- 7. Warten Sie, bis ein verdrehter Dienst gestartet wird, bevor Sie einen weiteren starten
- 8. Warten Sie, bis ein Skript heruntergeladen und ausgeführt wurde und warten Sie, bis DOM geladen wird
- 9. Warten bis QWidget schließt
- 10. warten bis Seite aktualisiert
- 11. Warten Sie, bis der untergeordnete Prozess in R
- 12. Warten Sie, bis der Benutzer die Interaktion mit UITableView beendet
- 13. So erstellen Sie einen Dienst, der beim Absturz neu startet
- 14. Warum warten Sie nicht, bis der Prozess beendet wird?
- 15. BrowserAction.onClicked Warten Sie, bis Iframe geladen wird
- 16. Android-Dienst, der mehrmals neu startet
- 17. Warum startet der Dienst nicht nach BOOT_COMPLETED?
- 18. Warten Sie, bis der Befehl vollständig in Bash
- 19. Warten, bis glutPostRedisplay() aktualisiert
- 20. Warten Sie, bis das http.get das Objekt
- 21. Warten Sie, bis alle Arbeiter fertig sind
- 22. Warten bis File.Exists?
- 23. Android Boot-Dienst startet nie
- 24. Android-Anwendung startet nicht Dienst
- 25. Warten Sie nicht, bis der Server mit ZeroMQ antwortet
- 26. Warten Sie, bis der Benutzer die Eingabe beendet hat. Tkinter
- 27. Warten Sie, bis der Ajax-Anruf für Capybara fertig ist.
- 28. Warten Sie, bis der Code die Ausführung beendet hat
- 29. Machen Sie Jenkins-Pipeline warten, bis der Server auf
- 30. Javascript Warten bis der Text erscheint
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 .... –
Oder einfach nur eine Sperrdatei beim Start, oder überprüfen Sie pid, oder etwas anderes, keinen Grund,' stdout 'hier zu erfassen. – BroSlow