我有这个:
#!/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。这是为什么?如何提高效率?
答案 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会定期启动您的脚本,但不会连续执行您的脚本。