0

我对 bash 很陌生(几乎没有任何经验),我需要一些关于 bash 脚本的帮助。

我正在使用 docker-compose 创建多个容器——对于这个例子,假设是 2 个容器。第二个容器将执行 bash 命令,但在此之前,我需要检查第一个容器是否可操作且已完全配置。我不想使用 sleep 命令,而是想创建一个 bash 脚本,该脚本将位于第二个容器中,一旦执行,请执行以下操作:

  1. 执行命令并将控制台输出记录到文件中
  2. 读取该文件并检查是否存在字符串。我将在上一步中执行的命令需要几秒钟(5 - 10)秒才能完成,我需要在完成执行后读取文件。我想我可以添加睡眠以确保命令完成执行,或者有更好的方法吗?
  3. 如果字符串不存在,我想再次执行相同的命令,直到找到我正在寻找的字符串
  4. 一旦我找到我正在寻找的字符串,我想退出循环并执行不同的命令

我发现了如何在 Java 中执行此操作,但如果我需要在 bash 脚本中执行此操作。

docker-containers 将 alpine 作为操作系统,但我更新了 Dockerfile 以安装 bash。

我尝试了这个解决方案,但它不起作用。

#!/bin/bash

[command to be executed] > allout.txt 2>&1

until 
  tail -n 0 -F /path/to/file | \
  while read LINE
  do
    if echo "$LINE" | grep -q $string
    then
      echo -e "$string found in the console output"
  fi
  done
do
    echo "String is not present. Executing command again"
    sleep 5
    [command to be executed] > allout.txt 2>&1
done

echo -e "String is found"
4

2 回答 2

1

在您的docker-compose文件中使用depends_on选项。

depends_on将负责您的多个容器的启动和关闭顺序。

但它不会在移动到另一个容器启动之前检查容器是否准备好。要处理这种情况,请查看内容。

如此链接中所述,

  • 您可以使用诸如wait-for-itdockerize或 sh-compatible wait-for 等工具。这些是小型包装脚本,您可以将它们包含在应用程序的映像中,以轮询给定的主机和端口,直到它接受 TCP 连接。

或者

  • 或者,编写您自己的包装脚本来执行更特定于应用程序的运行状况检查。

如果您不想使用上述工具,请检查一下。在这里,他们使用HEALTHCHECK和条件的组合,如此service_healthy所示。对于完整的例子检查这个

于 2019-12-29T10:19:58.807 回答
0

只是:

while :; do
   # 1. Execute a command and log the console output in a file
   command > output.log
   # TODO: handle errors, etc.
   # 2. Read that file and check if a String is present.
   if grep -q "searched_string" output.log; then
       # Once I find the string I am looking for I want to exit the loop
       break;
   fi
   # 3. If the string is not present I want to execute the same command again until I find the String I am looking for
   # add ex. sleep 0.1 for the loop to delay a little bit, not to use 100% cpu
done
# ...and execute a different command
different_command

您可以使用 timeout 使命令超时

笔记:

  • 冒号是一个返回零退出状态的实用程序,很像true,我更喜欢while :而不是while true,它们的含义相同。
  • 提供的代码应该可以在任何 posix shell 中工作。
于 2019-12-29T10:23:28.373 回答