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 结合起来表现很奇怪的主要内容,如果未能解决你的问题,请参考以下文章