Как запустить блокирующий процесс (сервер), а затем выполнить его curl из того же скрипта?

Как запустить блокирующий процесс (сервер), а затем выполнить его curl из того же скрипта?

Я пытаюсь запустить DeepDetect (сервер машинного обучения) в Docker [обратите внимание, что это не вопрос по DeepDetect — это просто вопрос по Bash]. Однако я столкнулся с более общей проблемой Linux/bash, и надеюсь получить помощь по ее решению.

Вот что мне нужно сделать:

  1. Из скрипта оболочки, запущенного через Dockerfile ENTRYPOINT, запустите сервер DeepDetect, заблокируйте его (это сервер, поэтому он должен работать вечно). Я хочу, чтобы скрипт, запускающий это, был корневым процессом, чтобы в случае его сбоя Docker перезапустил контейнер.

  2. Послесервер запущен, из того же скрипта отправьте curl следующим образом на указанный выше работающий сервер:

curl -X PUT "http://localhost/services/age" -d '{ "mllib":"caffe", "description":"возрастная классификация", "type":"supervised", "parameters":{ "input":{ "connector":"image", "height":227, "width":227 }, "mllib":{ "nclasses":8 } }, "model":{ "repository":"/models/age_model" } }'

Итак, вот моя проблема - как мне запустить curl, если сервер работает вечно? Похоже, мне нужно как-то запустить другой процесс в фоновом режиме до запуска сервера, который затем возвращается после запуска сервера и запускает указанное выше выражение curl.

Есть ли у кого-нибудь идеи, как выполнить эту задачу "скрипт вызова за 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

Я не проверял это, но вы можете попробовать эту идею в любом случае. Также вы должны использовать формат exec для entrypoint и cmd (не shell):

ENTRYPOINT ["/entrypoint.sh"]

Связанный контент