2016-06-09 36 views
0

我有这样的:看文件夹 - 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。这是为什么?如何提高效率?

+1

您使用的是什么操作系统?你看过[inotify](http://en.wikipedia.org/wiki/Inotify)吗? –

回答

-1

原因是即使在调用sleep命令时脚本仍在运行。我的建议是使用“inotifywait”或“watch”(Alternative solution)命令启动脚本,并避免使用while循环。

参见:http://linux.die.net/man/1/watch

从MAN页面中抽取的:

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

watch -d ls -l 

关注将会定期推出脚本但没有连续执行脚本。

+0

'watch'与while + sleep没有区别。 –

+0

它不是。没有CPU高峰。 – Gala

+0

手表使用系统中断,所以不会像+ +睡眠那样连续执行,但是我不得不承认,inotifywait是更优雅的解决方案。 –

5

这是inotifywait的工作。 inotify是Linux基于事件的系统,用于监视文件和目录以进行更改。再见轮询循环!

NAME
inotifywait - 等待文件的更改使用inotify的

提要

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

说明
inotifywait使用Linux的更改的文件有效地等待接口。它适用于等待从shell脚本更改 文件。它可以在事件发生时退出,或者在事件发生时持续执行和输出事件。

这里是你如何编写一个简单的循环,其检测当文件被添加,修改,或从目录中删除:

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

看看在man page了更多的选择。如果您只关心修改并希望忽略简单阅读的文件,则可以使用-e来限制事件的类型。

+0

你的循环无限期地在我的系统上。 Linux,zsh。我正在执行树。 – Gala

+0

没错。这是一个无限循环,就像你原来的程序一样。 –

1

虽然像inotify一个OS具体解决方案会更好,你可以显着地通过移动睡了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使用率显着,现在你总是检查应该下降每秒一次,而不是在没有变化时尽可能经常。您也可以用find替换tree,并在每次检查之间休息较长时间。