CygWin で実行するシェル スクリプトを作成しました。その目的は、ファイルの変更を監視することです。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 シェルのメモリ不足に関連したものでした。) ありがとう!
(CygWin で利用可能なメモリを増やすことを含む解決策を提案する場合、それは非論理的に思えます。スクリプトは時間の経過とともにメモリ使用量を徐々に増やしているためです。したがって、そのような解決策は避けられないことを遅らせるだけだと思います。)