grep 与 inotifywait 结合起来表现很奇怪

Posted

技术标签:

【中文标题】grep 与 inotifywait 结合起来表现很奇怪【英文标题】:grep behaves strange in combination with inotifywait 【发布时间】:2016-07-18 18:23:40 【问题描述】:

我很难理解 grep 返回值的某种异常。

如 grep 手册页中所述,如果匹配,则返回值为零,如果不匹配/错误/等,则返回非零。

在这段代码中:(bash)

inotifywait -m ./logdir -e create -e moved_to |
  while read path action file; do
    if grep -a -q "String to match" "$path/$file"; then
      # do something  
    fi
  done

匹配时返回非零值。

在这段代码中:(bash)

search_file()

  if grep -a -q "String to match" "$1"; then
    # do something
  fi


inotifywait -m ./logdir -e create -e moved_to |
    while read path action file; do
      search_file "$path/$file"
    done

匹配时返回零。

谁能给我解释一下这是怎么回事?

编辑: 让我再清楚一点:如果我在包含字符串的文件上运行第一个代码,则 if 语句正在运行。如果我在同一个文件上运行第二个代码,则 if 语句将失败并且不会运行。

【问题讨论】:

“匹配时返回非零” 不,它没有。其他事情正在发生。在我的脑海中,一种可能性是,由于您等待事件 create 而不是 close_write,因此在运行 grep 测试时仍在写入文件。 你怎么知道它返回了什么?你是说在后一种情况下它只运行if 语句的主体? @john1024 - 没有其他事情发生。没有错误(我也检查了没有 -q) @Nlandau 为了我们可以进一步帮助您,展示一个完整且可重复的示例。 没有理由会以这个(不完整的)示例目前呈现的方式发生这种情况。 【参考方案1】:

我支持@John1024他写成comment的猜想。

“异常”可能是由于您的脚本的两个版本之间存在细微的时间差异。如果发生create 事件,文件最初是空的,因此grep 将开始扫描部分写入的文件。通过函数调用grep 会引入一个小的延迟,这会增加搜索到的数据在grep 打开文件时出现在文件中的机会。

这种竞争条件的解决方案取决于几个假设/要求:

你能假设监视目录中的预先存在的文件不会被修改吗?

您是否希望尽快识别每个新的匹配文件,或者您可以承受延迟其处理直至其关闭的代价?

【讨论】:

终于成功了。正如@john1024 建议的那样,在inotify 事件发生后的小睡眠解决了这个问题。我必须这样做,因为我不能等待 close_write (它不断被写入)并且创建事件即将到来。感谢您的帮助!

以上是关于grep 与 inotifywait 结合起来表现很奇怪的主要内容,如果未能解决你的问题,请参考以下文章

包与常用模块

在脚本中使用 inotifywait -m 而不创建额外的进程?

07 grep命令与正则表达式

grep结合正则过滤

linux学习-grep使用正则表达式示例

linux下的find与grep命令的功能相似吗?