Linux

如何啟動一個阻塞程序(伺服器),然後從同一個腳本捲曲它?

  • August 27, 2018

我正在嘗試在 Docker 中操作 DeepDetect(機器學習伺服器)

$$ note this is not a DeepDetect question - it is simply a Bash question $$. 但是,我遇到了一個更普遍的 Linux/bash 問題,我希望得到幫助。 這是我需要做的:

  1. 從通過 Dockerfile ENTRYPOINT 啟動的 shell 腳本,啟動 DeepDetect 伺服器,阻止它(它是一個伺服器,因此它應該永遠執行)。我希望執行它的腳本成為根程序,這樣如果它崩潰,Docker 將重新啟動容器。
  2. 伺服器執行後,從同一個腳本中,向上面正在執行的伺服器發送如下 curl :

curl -X PUT " http://localhost/services/age " -d ‘{ “mllib”:“caffe”, “description”:“年齡分類”, “type”:“監督”, “parameters”:{ “輸入“:{“連接器”:“圖像”,“高度”:227,“寬度”:227},“mllib”:{“nclasses”:8}},“模型”:{“儲存庫”:“/模型/age_model” } }’

好的,這是我的問題 - 如果伺服器永遠執行,我該如何執行 curl?似乎我需要在伺服器啟動之前以某種方式在後台啟動另一個程序,然後在伺服器啟動後返回並執行上面的 curl 表達式。

有誰知道如何完成這個“在 30 秒內呼叫腳本”的問題?任何幫助是極大的讚賞!

對於基本問題:

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

現在不可避免地會出現問題sleep 30- 有時伺服器可能需要更長的時間才能啟動,或者它可能在curl執行時正在重新啟動。curl在執行您想要的操作之前,您可以增加很多複雜性來重試或檢查伺服器是否可用(通常使用不同的)。

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(不是 shell)使用 exec 格式:

ENTRYPOINT ["/entrypoint.sh"]

引用自:https://serverfault.com/questions/928073