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

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

我正在嘗試在 Docker 中操作 DeepDetect(機器學習伺服器)[注意,這不是 DeepDetect 問題 - 這只是一個 Bash 問題]。然而,我遇到了一個更普遍的 Linux/bash 問題,我希望得到幫助。

這是我需要做的:

  1. 從透過 Dockerfile ENTRYPOINT 啟動的 shell 腳本,啟動 DeepDetect 伺服器,阻止它(它是一個伺服器,所以它應該永遠運行)。我希望運行此腳本的腳本成為根進程,這樣如果它崩潰了,Docker 將重新啟動容器。

  2. 伺服器正在運行,從同一腳本,將如下的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"]

相關內容