我怎样才能运行一个不会退出的命令,直到成功?

我有一个运行HBaseDocker容器请参阅这里了解更多关于它的细节。 基本上,HBase大概需要三十年才能活起来。

显然我有其他容器取决于这一个。 在其中之一,在docker-entrypoint.sh我基本上是这样做的:

 #!/bin/bash /path/to/command argument while [ $? -ne 0 ]; do sleep 2; /path/to/command argument done 

这里的问题是/path/to/command是部署一个Web服务器,它将与HBase容器交互。 如果成功,它会阻塞当前进程(这很好,因为它在一个容器中),但是同样,如果失败,它将打印堆栈跟踪,但不会以某个-ne 0代码退出(实际上,根本不退出)。 事实上,如果它退出--restart=always会处理它。

所以,我的问题是,我怎样才能保持它重试,直到成功,基本上没有退出一些失败代码? 从Docker容器退出也是一个选项,以便它可以保持重新启动直到成功。 现在,我没有机会修改不存在的退出代码。

更新:

我必须这样做:

 #!/bin/bash tmp=$(mktemp) /path/to/command args 2> "$tmp" & while true; do sleep 5; if [ -s "$tmp" ]; then exit fi done 

基本上,我必须在后台运行它,以便上面的脚本将继续执行( path/to/command是一个UI阻止命令 – 如listen服务器 – 成功时不会退出 – 监听 – 也不是失败 – 它应该有,这就是为什么我问这个问题 – )。

所以为了让Docker容器不能退出,我不得不添加一段while true; 循环,我正在检查$tmp是否有错误。 如果有,我只是exit

更新2:

我改变了bash脚本:

 #!/bin/bash /path/to/command args & while true; do sleep 10; response=$(curl --write-out %{http_code} --silent --output /dev/null http://localhost); if [ "$response" != "200" ]; then exit fi done 

因为我的容器正在部署一个Web服务器,所以我至less要在主线程中监视它的状态。 还有改进的余地。

您可以尝试将stderrredirect到一个文件,然后检查该文件是否为空:

 tmp=$(mktemp) /path/to/command argument 2> "$tmp" # Run code until "$tmp" is empty until [ -s "$tmp" ]; do sleep 2 /path/to/command argument 2> "$tmp" done rm "$tmp"