【问题标题】:File content cannot be read until several retries在重试几次之前无法读取文件内容
【发布时间】:2021-09-23 11:35:49
【问题描述】:

我有一个 bash 脚本,它处理 SQL 文件以获取将多个寄存器插入offer 表的行。代码是:

if [ -f "$last" ]; then

    retry=0

    lines=$(grep "INSERT INTO \`offers\`" "$last" | sed -e $'s/),(/)\\\n, (/g')
    while [ -z "$lines" ]; do
        retry=$(( 1 + $retry ))
        printf "Retry %3d\n" $retry
        sleep 1

        lines=$(grep "INSERT INTO \`offers\`" "$last" | sed -e $'s/),(/)\\\n, (/g')
    done

    if [ -n "$output" ]; then
        echo "$lines" > "$output"
    else
        echo "$lines"
    fi
fi

路径名是$last var。该文件存在,并且已填充,并且具有我要查找的行。但是,正如您所看到的,我需要重试几次才能获得线路,但最终我得到了它。我想知道,为什么我需要多次尝试?更好的是,如何在第一次尝试时获得它?

一些注意事项:文件很长(300M),我要查找的行大约有 30,000 个字符长度。

【问题讨论】:

  • 也许你要找的部分还没有写出来?是否有可能写入文件的任何内容都与您的脚本运行并行? existing 文件并不意味着它已经完全写入。您可能应该弄清楚如何找出正在写入文件的东西何时完成写入,然后才访问该文件。如果您没有简单的方法来做到这一点,您可以使用迂回的方法,例如检查 lsof 是否有人仍然打开文件以供写入,或者等待其大小为非零且不再增加几秒钟。
  • 或者文件可能一直被重写,导致它在grep试图读取它的中间被截断?在这种情况下,您可以尝试重命名文件,等待它被完全写入然后读取它(以便下一个写入周期将转到具有原始名称的新文件)。了解应该如何创建此文件会很有帮助。
  • 感谢@CherryDT。不,当我尝试 grep 文件时,文件已满。我没有在上面包含这些行,但脚本会等待。并且没有其他进程在处理文件时重写文件。
  • 那么发生的事情是不合逻辑的。你100%确定吗?每次grep 时尝试运行tail "$last",以确保100% 确定这一点。
  • 你是对的@CherryDT,当我尝试 grep 文件时,文件没有写满。它可能需要另一个不同的问题,因为脚本调用 mysqldump 来创建文件,并且它似乎在开始查找该行之前就完成了。但是没有,调用返回后mysqldump继续往文件中写入数据。

标签: bash macos file grep script


【解决方案1】:

我发现的一个问题是在 grep 语句中:

grep "INSERT INTO \`offers\`" "$last"

我已经在我创建的示例文件上尝试了这个命令,但它没有产生任何输出。经过几次试验和错误,我发现使用单引号而不转义可以工作:

grep 'INSERT INTO `offer`' "$last"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2022-01-15
    • 2016-07-18
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多