2012-05-31 36 views
3

我已经编写了一个在CygWin下运行的shell脚本,其目的是监视文件的变化。如果MD5散列未能匹配前一个散列,它将执行一个命令来处理该文件。我在散列检查之间使用了1秒的延迟。这个工作好几个小时,但随后给出了“内存不足”的错误,实际上让Windows 7陷入了困境。Shell脚本循环用完CygWin下的内存

脚本在循环中使用循环;外层循环在设计上是无限的,内层循环在找到不匹配的散列并处理文件时结束。它在运行内部循环时破坏了,而没有在那个时间点修改文件。该文件以前被多次修改过,触发内部循环下方的代码,但不会在内存错误发生的时候触发。

我只是想知道为什么这里的循环消耗越来越多的内存随着时间的推移。我将新的MD5值反复分配到现有变量中,而不是为每个MD5分配分配新变量。 (对吗?)1秒可能太短暂的延迟......系统是否需要时间来解除内循环的每次迭代之间的某些事情?

#!/bin/sh 

FILE_TO_CHECK=/mypath/style.less 

echo "Reading hash for $FILE_TO_CHECK with md5sum" 
MD5PRINT=`md5sum $FILE_TO_CHECK | cut -d " " -f1` 

MD5PRINTNEW=$MD5PRINT 

while [[ 1 = 1 ]] 
do 
     echo "Waiting for file to change..." 

     while [[ "$MD5PRINT" = "$MD5PRINTNEW" ]] 
     do 
       sleep 1 

       MD5PRINTNEW=`md5sum $FILE_TO_CHECK | cut -d " " -f1` 
     done 

     echo "File was modified ... Running compiler..." 

     /mypath/lessc $FILE_TO_CHECK /mypath/style.css -x 

     echo "Reading hash for $FILE_TO_CHECK with md5sum" 
     MD5PRINT=`md5sum $FILE_TO_CHECK | cut -d " " -f1` 

     MD5PRINTNEW=$MD5PRINT 
done 

任何帮助,将不胜感激。如果需要,我可以提供确切的内存错误,但是我需要一些帮助来了解CygWin中的哪些日志(如果有)要查看,挖掘并找到错误文本。 (我宁愿不要整天运行它来重现错误,这个错误肯定与我的CygWin shell内存不足有关。)谢谢! (如果你提出的解决方案涉及增加CygWin的可用内存,这似乎是不合逻辑的,因为脚本随着时间逐渐增加自己的内存使用量。因此,我认为这样的解决方案只会延迟不可避免的。 )

+0

你正在运行哪个版本的cygwin?你有没有尝试过使用本地Linux shell? – xeor

+0

使用最新的CygWin,几天前从他们的网站安装。我还没有尝试过其他发行版,但我确信这是CygWin特有的问题。现在我已经在http://news.gmane.org/gmane.os.cygwin上发布了这个问题,并在那里得到了一些有用的回复。 –

+0

很高兴你发现它是什么,对它没有一个好的解决方案。建议你用一个或两个这样的句子在你的问题上用你的问题写一个自己的答案,在你的新闻组上有你的帖子的链接.. :) – xeor

回答