2012-05-31 2 views
3

Я написал сценарий оболочки, запущенный под CygWin, целью которого является отслеживание файла для изменений. Если хеш MD5 не соответствует предыдущему хэшу, он выполнит команду для обработки файла. Я использовал 1-секундную задержку между проверками хэша. Это работает отлично в течение нескольких часов, но затем дает ошибку «из памяти» и фактически приводит Windows 7 на колени.В оболочке сценария оболочки не хватает памяти под 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 исчерпала память.) Спасибо!

(Если вы предлагаете решение, которое предполагает увеличение памяти, доступной для CygWin, это кажется нелогичным, потому что скрипт постепенно увеличивает свое использование памяти с течением времени. Таким образом, такое решение только задерживало бы неизбежное, я думаю.)

+0

Какая версия cygwin вы используете? Вы пробовали это, используя родную оболочку Linux? – xeor

+0

Использование самого последнего CygWin, только что установленного с их сайта несколько дней назад. И я не пробовал другие дистрибутивы, но я уверен, что это проблема, характерная для CygWin. Теперь я опубликовал эту проблему на http://news.gmane.org/gmane.os.cygwin и получил полезные ответы. –

+0

Рад, что вы узнали, что это было, к плоху, у него не было хорошего решения. Предложите вам написать собственный ответ на свой вопрос о stackoverflow с предложением или двумя из того, что было, со ссылками на ваш пост в новостной группе .. :) – xeor

ответ

1

Это краткое описание информации, найденной boy uptown. Для записи :)

по почте/нити в Cygwin список рассылки, описывающий эту проблему находится в http://thread.gmane.org/gmane.os.cygwin/134041

http://cygwin.com/faq/faq.using.html#faq.using.bloda является ссылкой на приложение, которое может привести к этому «bļoda» ​​проблемы с Cygwin.

Смежные вопросы