观察文件夹的变化 - bash效率

时间:2016-06-09 18:46:52

标签: bash

我有这个:

#!/bin/bash

while :
do

SUM=$(tree | md5sum)

if [ "$SUMOLD" != "$SUM" ]; then

# do something here

SUMOLD=$SUM
sleep 1

fi

done

哪种方法效果很好。但是,问题在于它消耗了50%的CPU,即Core2 Duo T8300。这是为什么?如何提高效率?

3 个答案:

答案 0 :(得分:5)

这是inotifywait的工作。 inotify是Linux的基于事件的系统,用于监视文件和目录的变化。再见投票循环!

  

命名
         inotifywait - 等待使用inotify更改文件

     

概要

inotifywait [-hcmrq] [-e <event> ] [-t <seconds> ] [--format <fmt> ]
            [--timefmt <fmt> ] <file> [ ... ]
     

<强>描述
         inotifywait使用Linux的inotify(7)接口有效地等待对文件的更改。它适合等待更改          shell脚本中的文件。它可以在事件发生时退出,也可以在事件发生时不断执行和输出。

以下是如何编写一个简单的循环来检测从目录中添加,修改或删除文件的时间:

inotifywait -mq /dir | while read event; do
    echo "something happened in /dir: $event"
done

查看man page了解更多选项。如果您只关心修改并希望忽略只是被阅读的文件,您可以使用-e来限制事件类型。

答案 1 :(得分:1)

虽然像inotify这样的特定于操作系统的解决方案会更好,但您可以通过将if语句移出休眠来显着改善您的脚本:

#!/bin/bash

while :
do
  SUM=$(tree | md5sum)    
  if [ "$SUMOLD" != "$SUM" ]; then
    # do something here    
    SUMOLD=$SUM
    # move sleep from here
  fi
  sleep 1 # to here
done

由于您总是每秒检查一次,而不是在没有更改时尽可能频繁地检查,因此CPU使用率应该会急剧下降。您也可以将tree替换为find,并在每次检查之间休眠更长时间。

答案 2 :(得分:-1)

原因是即使调用命令sleep,脚本也会持续运行。我的建议是使用“inotifywait”或“watch”(替代解决方案)命令启动脚本,并避免使用while循环。

请参阅:http://linux.die.net/man/1/watch

MAN页面的一个例子:

要观看目录更改的内容,可以使用

watch -d ls -l

Watch会定期启动您的脚本,但不会连续执行您的脚本。