![Wie starte ich einen blockierenden Prozess (Server) und curle ihn dann aus demselben Skript heraus?](https://rvso.com/image/726376/Wie%20starte%20ich%20einen%20blockierenden%20Prozess%20(Server)%20und%20curle%20ihn%20dann%20aus%20demselben%20Skript%20heraus%3F.png)
Ich versuche, DeepDetect (einen Server für maschinelles Lernen) in Docker zu betreiben [beachten Sie, dass dies keine DeepDetect-Frage ist, sondern lediglich eine Bash-Frage]. Ich stoße jedoch auf ein allgemeineres Linux/Bash-Problem, bei dem ich auf Hilfe hoffe.
Folgendes muss ich tun:
Starten Sie den DeepDetect-Server über ein Shell-Skript, das über Dockerfile ENTRYPOINT gestartet wird, und blockieren Sie ihn (da es sich um einen Server handelt, sollte er für immer laufen). Ich möchte, dass das Skript, das dies ausführt, der Root-Prozess ist, sodass Docker den Container neu startet, falls er jemals abstürzt.
NachDer Server läuft. Senden Sie vom selben Skript aus einen Curl wie folgt an den oben genannten, jetzt laufenden Server:
curl -X PUT "http://localhost/services/age" -d '{ "mllib":"caffe", "Beschreibung":"Altersklassifizierung", "Typ":"überwacht", "Parameter":{ "Eingabe":{ "Anschluss":"Bild", "Höhe":227, "Breite":227 }, "mllib":{ "nclasses":8 } }, "Modell":{ "Repository":"/models/age_model" } }'
OK, also hier ist mein Problem – wie kann ich Curl ausführen, wenn der Server ewig läuft? Es scheint, als müsste ich vor dem Serverstart irgendwie einen anderen Prozess im Hintergrund starten, der dann nach dem Serverstart zurückkommt und den obigen Curl-Ausdruck ausführt.
Hat jemand eine Idee, wie man dieses Problem mit dem „Skript in 30 Sekunden aufrufen“ lösen kann? Jede Hilfe ist herzlich willkommen!
Antwort1
Zur grundsätzlichen Frage:
#!/usr/bin/env bash
./start-server.sh &
sleep 30
curl […]
wait
Jetzt wird es unvermeidlich Probleme geben sleep 30
- manchmal braucht der Server länger zum Starten oder er ist gerade dabei, neu gestartet zu werden, wenn curl
ausgeführt wird. Sie können viel Komplexität hinzufügen, indem Sie es erneut versuchen oder prüfen, ob der Server verfügbar ist (normalerweise mit einem anderen curl
), bevor Sie tun, was Sie möchten.
Antwort2
Der DeepDetect-Server sollte im Container als Daemon ausgeführt werden (als PID 1 ausgeführt):
CMD ["deepdetect"]
Im Entrypoint-Skript können Sie mit einer einfachen While-Schleife auf den Server warten:
while ! $(curl --output /dev/null --silent --head --fail
http://localhost:80); do
>&2 echo "Server is unavailable - sleeping"
sleep 1
done
Ich habe das nicht überprüft, aber Sie können diese Idee trotzdem ausprobieren. Außerdem sollten Sie das Exec-Format für Einstiegspunkt und cmd verwenden (nicht Shell):
ENTRYPOINT ["/entrypoint.sh"]