如何在失败前运行不会退出的命令?

时间:2016-06-08 09:26:08

标签: bash shell docker command

我有一个Docker容器正在运行HBase有关详细信息,请参阅here。基本上,HBase需要大约30秒才能活跃起来。

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

#!/bin/bash

/path/to/command argument

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

这里的问题是/path/to/command是部署网络服务器的东西,它将与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 - 当成功时不会退出-it听 - 当它失败时 - 它应该有,这就是为什么我问这个问题 - )。

因此,为了不让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服务器,所以在启动它之后,我至少在主线程中监视它的状态。还有改进的余地。

1 个答案:

答案 0 :(得分:2)

您可以尝试将stderr重定向到某个文件,然后检查该文件是否为空:

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"