【发布时间】: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