我有这样的:看文件夹 - 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。这是为什么?如何提高效率?
我有这样的:看文件夹 - 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。这是为什么?如何提高效率?
原因是即使在调用sleep命令时脚本仍在运行。我的建议是使用“inotifywait”或“watch”(Alternative solution)命令启动脚本,并避免使用while循环。
参见:http://linux.die.net/man/1/watch
从MAN页面中抽取的:
要观看目录更改的内容,你可以使用
watch -d ls -l
关注将会定期推出脚本但没有连续执行脚本。
'watch'与while + sleep没有区别。 –
它不是。没有CPU高峰。 – Gala
手表使用系统中断,所以不会像+ +睡眠那样连续执行,但是我不得不承认,inotifywait是更优雅的解决方案。 –
这是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
来限制事件的类型。
你的循环无限期地在我的系统上。 Linux,zsh。我正在执行树。 – Gala
没错。这是一个无限循环,就像你原来的程序一样。 –
虽然像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
,并在每次检查之间休息较长时间。
您使用的是什么操作系统?你看过[inotify](http://en.wikipedia.org/wiki/Inotify)吗? –