¿Cómo iniciar un proceso de bloqueo (servidor) y luego curlarlo desde el mismo script?

¿Cómo iniciar un proceso de bloqueo (servidor) y luego curlarlo desde el mismo script?

Estoy intentando operar DeepDetect (un servidor de aprendizaje automático) en Docker [tenga en cuenta que esta no es una pregunta de DeepDetect, es simplemente una pregunta de Bash]. Sin embargo, me encuentro con un problema más general de Linux/bash y espero obtener ayuda.

Esto es lo que necesito hacer:

  1. Desde un script de shell iniciado a través de Dockerfile ENTRYPOINT, inicie el servidor DeepDetect, bloquéelo (es un servidor, por lo que debería ejecutarse para siempre). Quiero que el script que ejecuta esto sea el proceso raíz, de modo que si alguna vez falla, Docker reiniciará el contenedor.

  2. Despuésel servidor se está ejecutando, desde el mismo script, envíe un curl de la siguiente manera al servidor anterior que ahora se está ejecutando:

rizo -X PONER "http://localhost/servicios/edad" -d '{ "mllib":"caffe", "descripción":"clasificación de edad", "tipo":"supervisado", "parámetros":{ "entrada":{ "conector":"imagen", "altura ":227, "ancho":227 }, "mllib":{ "nclasses":8 } }, "modelo":{ "repository":"/models/age_model" } }'

Bien, aquí está mi problema: ¿cómo puedo ejecutar curl si el servidor está funcionando para siempre? Parece que de alguna manera necesito iniciar otro proceso en segundo plano antes de que se inicie el servidor, que luego regresa después de que se inicia el servidor y ejecuta la expresión curl anterior.

¿Alguien tiene alguna idea de cómo solucionar este problema del "script de llamada en 30 segundos"? ¡Cualquier ayuda es muy apreciada!

Respuesta1

Para la pregunta básica:

#!/usr/bin/env bash
./start-server.sh &
sleep 30
curl […]
wait

Ahora, inevitablemente, habrá problemas sleep 30: a veces el servidor puede tardar más en iniciarse o puede estar en el proceso de reiniciarse exactamente cuando curlse ejecuta. Puede agregar mucha complejidad para volver a intentarlo o verificar si el servidor está disponible (generalmente con un servidor diferente curl) antes de hacer lo que desea.

Respuesta2

El servidor DeepDetect debe demonizarse en un contenedor (ejecutarse como pid 1):

CMD ["deepdetect"]

En el script de punto de entrada, puede esperar al servidor usando un bucle while simple:

while ! $(curl --output /dev/null --silent --head --fail 
http://localhost:80); do
    >&2 echo "Server is unavailable - sleeping"
    sleep 1
done

No verifiqué esto, pero puedes probar esta idea de todos modos. También deberías usar el formato exec para el punto de entrada y cmd (no el shell):

ENTRYPOINT ["/entrypoint.sh"]

información relacionada