我怎样才能运行一个不会退出的命令,直到成功?
我有一个运行HBase
的Docker
容器请参阅这里了解更多关于它的细节。 基本上,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要在主线程中监视它的状态。 还有改进的余地。
您可以尝试将stderr
redirect到一个文件,然后检查该文件是否为空:
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"