Я написал сценарий оболочки, запущенный под 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, это кажется нелогичным, потому что скрипт постепенно увеличивает свое использование памяти с течением времени. Таким образом, такое решение только задерживало бы неизбежное, я думаю.)
Какая версия cygwin вы используете? Вы пробовали это, используя родную оболочку Linux? – xeor
Использование самого последнего CygWin, только что установленного с их сайта несколько дней назад. И я не пробовал другие дистрибутивы, но я уверен, что это проблема, характерная для CygWin. Теперь я опубликовал эту проблему на http://news.gmane.org/gmane.os.cygwin и получил полезные ответы. –
Рад, что вы узнали, что это было, к плоху, у него не было хорошего решения. Предложите вам написать собственный ответ на свой вопрос о stackoverflow с предложением или двумя из того, что было, со ссылками на ваш пост в новостной группе .. :) – xeor