![如何啟動阻塞進程(伺服器),然後從同一腳本中捲曲它?](https://rvso.com/image/726376/%E5%A6%82%E4%BD%95%E5%95%9F%E5%8B%95%E9%98%BB%E5%A1%9E%E9%80%B2%E7%A8%8B%EF%BC%88%E4%BC%BA%E6%9C%8D%E5%99%A8%EF%BC%89%EF%BC%8C%E7%84%B6%E5%BE%8C%E5%BE%9E%E5%90%8C%E4%B8%80%E8%85%B3%E6%9C%AC%E4%B8%AD%E6%8D%B2%E6%9B%B2%E5%AE%83%EF%BC%9F.png)
我正在嘗試在 Docker 中操作 DeepDetect(機器學習伺服器)[注意,這不是 DeepDetect 問題 - 這只是一個 Bash 問題]。然而,我遇到了一個更普遍的 Linux/bash 問題,我希望得到幫助。
這是我需要做的:
從透過 Dockerfile ENTRYPOINT 啟動的 shell 腳本,啟動 DeepDetect 伺服器,阻止它(它是一個伺服器,所以它應該永遠運行)。我希望運行此腳本的腳本成為根進程,這樣如果它崩潰了,Docker 將重新啟動容器。
後伺服器正在運行,從同一腳本,將如下的curl發送到上面正在運行的伺服器:
捲曲-X PUT“http://localhost/服務/年齡" -d '{ "mllib":"caffe", "description":"年齡分類", "type":"監督", "parameters":{ "input":{ "connector":"image", "height “:227,“寬度”:227},“mllib”:{“nclasses”:8}},“模型”:{“存儲庫”:“/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
我沒有檢查這一點,但無論如何你都可以嘗試這個想法。另外,您應該對入口點和 cmd 使用 exec 格式(而不是 shell):
ENTRYPOINT ["/entrypoint.sh"]