【问题标题】:Why is this script doing nothing after the for loop?为什么这个脚本在 for 循环之后什么都不做?
【发布时间】:2020-01-31 18:47:49
【问题描述】:

我有这个 bash 脚本。它使用 cqlsh 等待设置 cassandra 模式。脚本的参数是 cassandra db 键空间。本质上,它检查schema_updates 表中是否至少有1 个条目。此表记录所有数据库迁移。如果该表中有任何条目,则表示该表的键空间现在可用。

问题是当我将此脚本用作 docker-compose 入口点时,没有执行 for 循环之后的命令。如果我直接调用它就可以了。

我认为问题与 cassandra 或 cassandra 查询无关。我已经单独测试了每一行,我已经在本地运行了整个脚本,我已经进入了由 docker-compose 文件启动的容器以手动启动脚本,它在所有三种情况下都按预期工作。

 #!/usr/bin/env bash

 for keyspace in "$@";
 do
      KEYSPACEFOUND=1
      until [[ $KEYSPACEFOUND = 0 ]];
      do
          cqlsh -u cassuser -p casspwd cassandra -e "select filename from $keyspace.schema_updates limit 1" 2>/dev/null | grep "(1 rows)" >/dev/null 2>&1
          let KEYSPACEFOUND=$?

      done
 done
 echo "All keyspaces are available"
 exec ./bin/applicationStartScript

【问题讨论】:

  • 到处添加echos,看看发生了什么。在脚本开头添加set -x 并检查输出。使用 until cqlsh .... | grep -q '(1 rows)'; do :; done 简化整个 KEYSPACEFOUND 分配
  • 也许这是一个竞争条件?执行脚本时某些内容不可用?
  • 好的,我添加了set -x,我注意到KEYSPACEFOUND 从未被分配给0。我做了你的重构,它似乎仍在发生 - 退出代码永远不是0
  • 实际上,set -x 确实有效。我意识到我传递的参数之一实际上不是有效的键空间。 for 循环卡在上面了。我应该在这里做什么?我应该发布答案吗?我认为这只是我的一个愚蠢的错误,不知道其他人可以从中获得多少收益
  • 我认为回答你自己的问题很好,这样社区就会知道问题已经解决,他们不会调查你的问题,节省其他人的时间:)

标签: bash docker for-loop docker-compose sh


【解决方案1】:

事实证明,我传递给脚本的参数之一不是有效的键空间。这意味着until 循环永远不会终止,因此 for 循环也不会。

【讨论】:

    猜你喜欢
    • 2023-01-13
    • 1970-01-01
    • 2018-08-12
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多