【问题标题】:Wait until a condition becomes true in bash等到条件在 bash 中变为真
【发布时间】:2020-08-01 22:10:17
【问题描述】:

在编写 shell 脚本时,我反复需要等待给定条件变为真,例如远程 URL 可用(使用 curl 检查)或应该存在的文件等。

理想情况下,我想要一个函数或脚本 await 以便我可以编写,例如,

await [[ some condition ]]

它会每秒检查一次条件,直到它变为真或发生超时。理想情况下,我可以设置轮询间隔和超时。

有没有这样的工具?

【问题讨论】:

  • await() {until "$@" ; do sleep 1 ; done } 怎么样? until 将把提供的参数作为带参数的命令执行,直到命令返回 true(如果返回 false,它将重试)。祝你好运。

标签: bash shell


【解决方案1】:

您可以使用until 循环:

until some condition
do
  sleep 5
done

例如

until nc -z localhost 22
do
  echo "SSHd is not up yet. Waiting..."
  sleep 5
done

如果要添加超时,则必须使用计数器或使用 internal SECONDS variable 单独添加:

SECONDS=0
until nc -z localhost 22
do
  
  if (( SECONDS > 60 ))
  then
     echo "Giving up..."
     exit 1
  fi

  echo "SSHd is not up yet. Waiting..."
  sleep 5
done

【讨论】:

  • 真的很好。而且,如果您的命令不昂贵,那么您最好将睡眠时间设置为亚秒级。在过去的几十年里,Unixy 的东西都支持这一点,以前只有整数可以工作。 sleep 0.1
【解决方案2】:

我会在使用sleepwhile 循环周围使用timeout 实用程序。

例如:

timeout 1 bash -c 'while :; do echo check; sleep 0.1; done ' 

【讨论】:

  • 这是一个很棒的单线解决方案。我用它来等待安装 git 和 docker:timeout 300 bash -c 'while :; do hash docker && hash git; sleep 0.1; done'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2021-06-07
  • 2016-01-28
  • 1970-01-01
相关资源
最近更新 更多