Linux
如何啟動一個阻塞程序(伺服器),然後從同一個腳本捲曲它?
我正在嘗試在 Docker 中操作 DeepDetect(機器學習伺服器)
$$ note this is not a DeepDetect question - it is simply a Bash question $$. 但是,我遇到了一個更普遍的 Linux/bash 問題,我希望得到幫助。 這是我需要做的:
- 從通過 Dockerfile ENTRYPOINT 啟動的 shell 腳本,啟動 DeepDetect 伺服器,阻止它(它是一個伺服器,因此它應該永遠執行)。我希望執行它的腳本成為根程序,這樣如果它崩潰,Docker 將重新啟動容器。
- 伺服器執行後,從同一個腳本中,向上面正在執行的伺服器發送如下 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"]