【问题标题】:Stop command execution after a while and execute next command in a shell script一段时间后停止命令执行并在 shell 脚本中执行下一个命令
【发布时间】:2020-07-07 03:34:52
【问题描述】:

我想创建一个执行以下操作的脚本:

  1. 创建 Kafka 服务器
  2. 在 Kafka 上创建主题
  3. 开始生成有关已创建主题的消息

我的脚本是这样的:

docker run -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=localhost --env ADVERTISED_PORT=9092 spotify/kafka
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic my_topic
jq -rc . messages.json | bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic my_topic

但是第一个命令的执行过程永远不会结束,它不能进入​​第二步。我怎么知道 Kafka 服务器已经准备好了,之后我该如何执行下一个命令?

【问题讨论】:

  • 使用 /bin/timeout,或者使用不同的进程而不是管道。
  • 嗨 Mert,您可以将 docker 命令输出通过管道传输到文件并保存吗?检查此文件以查看其中是否有任何字符串可以在 IF-ELSE 条件下使用以继续执行第 2 步?参考:scalyr.com/blog/how-to-redirect-docker-logs-to-a-single-file

标签: bash shell apache-kafka kafka-consumer-api kafka-producer-api


【解决方案1】:

您可以将-d 选项添加到run 以在不附加到容器的情况下运行容器,从而让您的脚本立即继续。这引发了一个问题,即在服务器准备好接受您的 shell 脚本发出的任何请求之前要等待多长时间。一个粗略的解决方法是调用sleep 等待您认为必要的时间。

docker run -d ...
sleep 10  # Ten seconds should be plenty
bin/kafka-topics.sh ...

【讨论】:

  • 由于我们无法预测等待时间,“睡眠”似乎不是这里的最佳解决方案。
  • 那么你需要一些方法来查询服务器以查看它何时是安全的。我自己对卡夫卡并不熟悉;但允许docker 命令完成是必要的第一步。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
相关资源
最近更新 更多