2012-05-31 37 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

回答