【问题标题】:Bash for loop, wait for curl response before continuing [closed]Bash for循环,在继续之前等待curl响应[关闭]
【发布时间】:2020-05-05 15:22:51
【问题描述】:

我有一个 curl 命令,如下所示:

curl -Iks https://<domain>/<application>

这可能会返回 200 OK,或者失败并返回不同的状态代码。

这个 curl 是在基于我们反向代理后面的一系列不同应用程序的 for 循环中执行的。我依靠 curl 命令的响应(状态代码)来确定下一步应该做什么。

在输出中,我在 if 语句中的回声似乎与 curl 不同步(或根本不执行)。就好像循环的移动速度比 curl 完成返回响应的速度快——我认为这是不可能的?

可能是在 if 语句中执行了第二个 curl(用于 API 帖子)?我只是不知道为什么?

for 循环类似于:

for indx in "${!apps[@]}"; do
   response=$(curl -Iks $url)

   if [[ $response == *HTTP/1.1 200*]]; then 
      #...
      echo "$appname active!"
      postToAPI
   elif [[ $response == *HTTP/1.1 302*]]; then 
      #...
      echo "$appname is being redirected."
      postToAPI
   else 
      #...
      echo "$appname is down!"
   fi 
done

我已经验证 $appname、$apps 和 $url 都是同步的,并且没有在它们的数组索引中混淆

有谁知道他们为什么执行不同步?或者有时完全跳过?哪个应用程序有时被遗漏或打印不同步似乎是随机的。

【问题讨论】:

  • 在我的 for 循环中,响应并不总是按时返回,但 for 循环仍在执行,因此跳过了我的一些应用程序。这是不可能的
  • @oguzismail 我认为,就像大多数代码一样,它逐行运行并且不会那样做 - 有什么想法为什么会发生这种情况?
  • 要想知道我应该首先能够重现问题
  • @oguzismail 这有点棘手 - 除非您在反向代理后面有多个可以 curl 的应用程序?
  • 正如@oguzismail 所说,这里的代码确实在继续之前等待curl 响应。 response 直到 curl 关闭其标准输出(将其写入输出的文件描述符)才分配。在您的真实代码和环境中必须存在其他未在此处显示的内容,然后才会出现相反的行为。

标签: linux bash shell curl


【解决方案1】:

请尝试response=$(echo "" | curl -Iks $url)

有时它会有所帮助,因为 curl 可能会“吃掉”您的输入。

【讨论】:

  • 在你的 curl 周围加上 $(...) 会使 curl 的 output 被字符串分割、全局扩展,然后由 shell 作为另一个命令运行。一般来说,这是一个非常糟糕的主意——当然,-I 你的标准输出不会是 URL 的主体,但是如果在运行上述引用的处理时标头要解析为恶意命令,我们会在一个非常不幸的地方。
  • 防止 curl 吃掉输入的更安全的方法是在命令后面加上&lt;/dev/null。它也更有效率(这个答案的方法至少创建两个子shell,在实际调用 curl 的分叉副本之前多次告诉 bash 到 fork() 本身)。
  • 感谢@CharlesDuffy 的cmets。这是正确的, echo "" 的唯一原因是它(IMO)更具可读性。并且 $() 在问题中。
  • 我在分配上下文中从使命令替换有意义的问题中进行了编辑,因此除了 OP 之外的其他人阅读此答案不会冒险将命令替换解释为他们被指示的东西做。
猜你喜欢
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多