Como iniciar um processo de bloqueio (servidor) e depois enrolá-lo no mesmo script?

Como iniciar um processo de bloqueio (servidor) e depois enrolá-lo no mesmo script?

Estou tentando operar o DeepDetect (um servidor de aprendizado de máquina) no Docker [observe que esta não é uma pergunta do DeepDetect - é simplesmente uma pergunta do Bash]. No entanto, estou me deparando com um problema mais geral do Linux/bash para o qual espero obter ajuda.

Aqui está o que preciso fazer:

  1. A partir de um script shell iniciado via Dockerfile ENTRYPOINT, inicie o servidor DeepDetect, bloqueie-o (é um servidor, portanto deve funcionar para sempre). Quero que o script que executa este seja o processo raiz, para que, se travar, o Docker reinicie o contêiner.

  2. Depoiso servidor está em execução, a partir do mesmo script, envie um curl da seguinte maneira para o servidor em execução acima:

curl -X COLOCAR "http://localhost/services/age" -d '{ "mllib":"caffe", "description":"classificação etária", "type":"supervisionado", "parâmetros":{ "input":{ "conector":"imagem", "altura ":227, "width":227 }, "mllib":{ "nclasses":8 } }, "model":{ "repository":"/models/age_model" } }'

OK, então aqui está o meu problema - como posso executar o curl se o servidor estiver funcionando para sempre? Parece que preciso iniciar de alguma forma outro processo em segundo plano antes de o servidor iniciar, que volta depois que o servidor é iniciado e executa a expressão curl acima.

Alguém tem alguma idéia de como resolver esse problema de "script de chamada em 30 segundos"? Qualquer ajuda é muito apreciada!

Responder1

Para a pergunta básica:

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

Agora, inevitavelmente, haverá problemas com sleep 30- às vezes o servidor pode demorar mais para inicializar ou pode estar no processo de reinicialização exatamente quando curlé executado. Você pode adicionar muita complexidade para tentar novamente ou verificar se o servidor está disponível (normalmente com um arquivo curl) antes de fazer o que deseja.

Responder2

O servidor DeepDetect deve ser daemonizado no contêiner (executado como pid 1):

CMD ["deepdetect"]

No script do ponto de entrada você pode esperar pelo servidor usando um loop while simples:

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

Eu não verifiquei isso, mas você pode tentar essa ideia de qualquer maneira. Além disso, você deve usar o formato exec para ponto de entrada e cmd (não shell):

ENTRYPOINT ["/entrypoint.sh"]

informação relacionada