【发布时间】:2012-06-05 22:15:21
【问题描述】:
我编写了一个在 CygWin 下运行的 shell 脚本,其目的是监视文件的更改。如果 MD5 哈希与之前的哈希匹配失败,它将执行命令来处理文件。我在哈希检查之间使用了 1 秒的延迟。这可以运行几个小时,但随后会出现“内存不足”错误,实际上会使 Windows 7 崩溃。
脚本在循环中使用循环;外循环在设计上是无限的,内循环在找到不匹配的哈希并处理文件时结束。它在运行内部循环时中断,当时没有修改文件。该文件之前被修改过无数次,触发了内循环下面的代码,但不是在内存错误发生的时候。
我只是想知道为什么这里的循环会随着时间的推移消耗越来越多的内存。我一遍又一遍地将新的 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 可用内存的解决方案,这似乎不合逻辑,因为脚本会随着时间的推移逐渐增加其自身的内存使用量。因此,我认为这样的解决方案只会延迟不可避免的事情。)
【问题讨论】:
-
你运行的是哪个版本的 cygwin?您是否也尝试过使用本机 Linux shell?
-
使用最新的 CygWin,几天前刚从他们的网站安装。而且我还没有尝试过其他发行版,但我很确定这是 CygWin 特有的问题。现在我已经在news.gmane.org/gmane.os.cygwin 上发布了这个问题,并在那里得到了一些有用的回复。
-
很高兴你发现它是什么,可惜它没有一个好的解决方案。建议你在stackoverflow上写一个自己的答案,用一两句话来回答你的问题,并附上你在新闻组上的帖子的链接.. :)
标签: linux bash shell memory cygwin