차단 프로세스(서버)를 시작한 다음 동일한 스크립트에서 컬링하는 방법은 무엇입니까?

차단 프로세스(서버)를 시작한 다음 동일한 스크립트에서 컬링하는 방법은 무엇입니까?

Docker에서 DeepDetect(기계 학습 서버)를 작동하려고 합니다. [이것은 DeepDetect 질문이 아닙니다. 단순한 Bash 질문입니다.] 그러나 좀 더 일반적인 Linux/bash 문제에 직면하여 도움을 받고 싶습니다.

내가 해야 할 일은 다음과 같습니다.

  1. Dockerfile ENTRYPOINT를 통해 시작된 셸 스크립트에서 DeepDetect 서버를 시작하고 차단합니다(서버이므로 영원히 실행되어야 함). 이를 실행하는 스크립트가 루트 프로세스가 되기를 원합니다. 그러면 충돌이 발생하면 Docker가 컨테이너를 다시 시작할 것입니다.

  2. 후에서버가 실행 중이면 동일한 스크립트에서 현재 실행 중인 위 서버에 다음과 같이 컬을 보냅니다.

컬 -X PUT "http://localhost/services/age" -d '{ "mllib":"caffe", "설명":"연령 분류", "유형":"감독됨", "매개변수":{ "입력":{ "커넥터":"이미지", "높이 ":227, "width":227 }, "mllib":{ "nclasses":8 } }, "model":{ "repository":"/models/age_model" } }'

좋아요, 제 문제는 다음과 같습니다. 서버가 영원히 실행되는 경우 어떻게 컬을 실행할 수 있습니까? 서버가 시작되기 전에 어떻게든 백그라운드에서 다른 프로세스를 시작해야 하는 것 같습니다. 그런 다음 서버가 시작된 후에 다시 돌아와 위의 컬 표현식을 실행합니다.

"30초 안에 호출 스크립트" 문제를 해결하는 방법을 아는 사람이 있습니까? 어떤 도움이라도 대단히 감사하겠습니다!

답변1

기본 질문의 경우:

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

이제 필연적으로 문제가 발생합니다 sleep 30. 때로는 서버를 시작하는 데 시간이 더 오래 걸리거나 실행될 때 정확히 다시 시작하는 과정에 있을 수도 있습니다 curl. curl원하는 작업을 수행하기 전에 재시도하거나 서버를 사용할 수 있는지(일반적으로 다른 서버를 사용하여) 확인하는 데 많은 복잡성이 추가될 수 있습니다 .

답변2

DeepDetect 서버는 컨테이너에서 데몬화되어야 합니다(pid 1로 실행).

CMD ["deepdetect"]

진입점 스크립트에서는 간단한 while 루프를 사용하여 서버를 기다릴 수 있습니다.

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

나는 이것을 확인하지 않았지만 어쨌든 이 아이디어를 시도해 볼 수 있습니다. 또한 진입점 및 cmd(셸 아님)에 exec 형식을 사용해야 합니다.

ENTRYPOINT ["/entrypoint.sh"]

관련 정보