【问题标题】:Inotifywait not work as expected with while loopInotifywait 在 while 循环中无法按预期工作
【发布时间】:2021-01-31 19:28:00
【问题描述】:

我想在监控目录中运行修改次数选项以及何时发生 3 个修改事件。我想运行一个命令。

我已经尝试了如下所示的代码,但是即使发生了修改事件,计数变量也没有增加。

#!/bin/bash
count=0
while :
do
    { inotifywait -m -q -e modify /home/testDir& let count="$count + 1"; } || exit 1
    if [ "$count" -eq "3" ]; then
        #Do something
        count=-250
    fi
done

【问题讨论】:

    标签: linux bash shell command-line inotifywait


    【解决方案1】:

    您的脚本和inotify 使用存在几个问题:

    inotifywait -m -q -e modify: -m:监听不退出,所以它永远不会退出,也永远不会打印出任何东西 -q: 不会打印任何东西 -emodify 事件不适用于目录,但适用于其中的文件

    { inotifywait -m -q -e modify /home/testDir& let count="$count + 1"; } || exit 1
    

    将在后台启动inotifywait,立即加1计数并继续

    let count="$count + 1: 已经过时了。请改用count=$((count + 1))

    固定版本:

    #!/usr/bin/env sh
    
    count=0
    while :; do
      {
        inotifywait -qe 'modify' /home/lea/t/testDir || exit 1
      } >/dev/null 2>&1 
      count=$((count + 1))
      if [ "$count" -eq "3" ]; then
        echo 'Do something'
        count=-250
      fi
    done
    

    【讨论】:

    • 感谢您的出色回答,它按预期工作。但是,我想在 count 等于 3 时终止特定进程。但是,当我使用 kill 命令终止进程时,它不会立即终止。您是否认为inotifywait 不够快,无法在modify action 发生后立即终止进程。
    • 取决于在达到 3 后要终止的进程。您的意思是跳出 while 循环吗?如果是这样,请使用if [ "$count" -eq "3" ]; then .. break
    • @kkk001 取决于事情发生得足够快(“立即”)几乎永远不会安全。即使你现在让它工作,它也可能随机失败,通常是在一些看似无关的事情发生变化时。这方面的标准术语是"race condition",它基本上被认为是一个错误和一个信号,表明你真的应该以不同的方式做事。
    【解决方案2】:

    问题出在let 语句中。您可以将其替换为:

    let "count=count+1";
    

    这个answer也很有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多