如何启动一个阻塞进程(服务器)然后从同一个脚本中对其进行 curl ?

如何启动一个阻塞进程(服务器)然后从同一个脚本中对其进行 curl ?

我正在尝试在 Docker 中操作 DeepDetect(机器学习服务器)[请注意,这不是 DeepDetect 问题 - 它只是一个 Bash 问题]。但是,我遇到了一个更常见的 Linux/bash 问题,希望得到帮助。

这是我需要做的:

  1. 从通过 Dockerfile ENTRYPOINT 启动的 shell 脚本,启动 DeepDetect 服务器,阻止它(它是一个服务器,因此它应该永远运行)。我希望运行此脚本的脚本成为根进程,这样如果它崩溃,Docker 将重新启动容器。

  2. 服务器正在运行,从同一脚本,向上面正在运行的服务器发送如下 curl:

curl-X 放“http://localhost/services/age“-d'{“mllib”:“caffe”,“description”:“年龄分类”,“type”:“supervised”,“parameters”:{“input”:{“connector”:“图像”,“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

我没有检查过这一点,但无论如何你都可以尝试这个想法。此外,你应该对入口点和 cmd 使用 exec 格式(而不是 shell):

ENTRYPOINT ["/entrypoint.sh"]

相关内容