【问题标题】:Check if output file is generated and populated with expected logs - BASH检查是否生成了输出文件并填充了预期的日志 - BASH
【发布时间】:2023-04-04 07:25:01
【问题描述】:

一个进程(在后台)应该创建一个文件(例如 result.txt)并用 5 个日志行填充它。

我需要检查:1) 文件是否存在 2) 检查是否存储了所有日志(5 行)

如果这些条件在 xxx 秒内不满足,则进程失败并在终端打印“FAILED”,否则打印“SUCCEED”。

我想我需要使用一个while循环,但我不知道如何实现这些条件

注意:这些行被附加到文件中(异步),我不必检查日志的合规性,只需检查是否所有内容都已存储

【问题讨论】:

  • 这些行是否附加到文件中?您需要具体说明行的内容吗?
  • 是的,这些行是附加的,我不必检查日志的合规性,只需检查是否都存储了
  • 那么这意味着您必须知道文件中的行数才能添加新数据,然后再检查是否添加了另外 5 行。您的问题实际上很复杂,因此如果您添加更多信息,人们可能只能提供帮助。
  • 检查过程是怎样的?发送日志的过程是否相同?
  • 这不是必需的,因为如果该过程成功,那么我将在接下来的步骤中删除该文件。所以我需要检查文件是否包含 5 行(后台进程应该产生这个输出并且没有更多行)

标签: bash file while-loop


【解决方案1】:

这是我的草稿:

FILE=/path/to/something
for (( ;; )); do
    if [[ -e $FILE ]] && WC=$(wc -l < "$FILE") && [[ WC -ge 5 ]]; then
        : # Valid.
    fi
done

或者

FILE=/path/to/something
for (( ;; )); do
    if [[ ! -e $FILE ]]; then
        : # File doesn't exist. Do something.
    elif WC=$(wc -l < "$FILE") && [[ WC -ge 5 ]]; then
        : # Valid.
    else
        : # File doesn't contain 5 or more lines or is unreadable. Invalid.
    fi
done

不过,这仍然可能存在竞争条件问题。

【讨论】:

    【解决方案2】:

    这个检查日志,等待2秒才失败:

    #!/bin/sh
    
    log_success() {
        [[ $(tail -n "$2" "$1" 2> /dev/null | wc -l) -eq "$2" ]]
    }
    
    log_success 'file.log' 5 || sleep 2
    if log_success 'file.log' 5; then
        echo "success"
    else
        echo "fail"
    fi
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 2018-06-27
      • 2018-07-12
      相关资源
      最近更新 更多