web-dev-qa-db-ja.com

IIS7にロックされたファイルを解放させるには?

本番環境でのビルド中、ルートディレクトリ内の非常に大きな(10メガバイト)静的コンテンツファイルはIISによってロックされ、クリーンタスクで削除できない場合があります。これは、同時に1人以上のクライアントに積極的にサービスを提供しました。

ビルドプロセスは、経由でクリーニングする前にWebサイトを停止します

c:\Windows\System32\inetsrv\appcmd.exe stop site http://oursite.com

ただし、これはしないでくださいファイルを解放します-プロセスをロックを解放するために、IISを再起動する必要があります。

appcmd.exeを使用すると、IIS完全に停止できます。私たちはしないでくださいこれを実行したいのです!

IISを再起動せずに、ロックされたファイルを手放すIISを取得する他の方法はありますか?個々のWebサイトを単に停止して開始するだけでは、ファイルロックが解除されません。

25
Jarrod Dixon

SysinternalのProcess Explorerなど、ファイルハンドルを見つけて強制的に閉じることができるツールがありますが、これを行った後のアプリケーションの状態と動作(この場合はIISの両方)は定義されていません。気にしない人、エラーになる人、激しくクラッシュする人もいます。

正しい解決策は、停止を取り、IISでロックを完全に解放し、サーバー自体の安定性を維持するためにそれ自体をクリーンアップできるようにすることです。これが不可能な場合は、同じボックスに別のサイトを作成することもできます。 、または新しいコンテンツを含む新しいボックスをセットアップし、ドメイン名/ IPを移動して、新しいコンテンツを本番環境に「宣伝」します。

12
Greg Work

私は "Handle" と呼ばれる小さなツールを使用してこれを行います。

基本的には、ロックされているファイルの名前を渡し、どのプロセスがそれを使用しているかを通知します。

handle c:\weird.file
Something.exe pid: 1000 100: C:\weird.file
Something.exe pid: 1000 101: C:\weird.file

次に、それに-cスイッチを渡して、ハンドルを閉じます。

handle.exe -c 101 -p 1000 -y
handle.exe -c 100 -p 1000 -y

出力を解析するラッパープログラムなしでビルドスクリプトを作成するのに苦労するかもしれませんが、うまくいけばこれが役立つでしょう。

13
Simon Johnson

一時的なアセンブリでのaspxファイルのコンパイルを意味するかどうかはわかりません。すべてのaspx/ascxファイルを事前にプリコンパイルする ASP.NETデプロイメントプロジェクト を使用しています。

"publish"から "bin"フォルダーにバイナリファイルをコピーしている間、すべてのアセンブリがコピーされた後(ほんの数秒)に削除されるapp_offline.htmファイルを一時的に有効にします。このようにして、ファイルロックを経験したことはありません。

編集:

Webサイトを停止する代わりに、appcmd.exeを使用してアプリプールをリサイクルしてみることができます。

C:\Windows\System32\inetsrv\appcmd.exe recycle apppool "My App Pool Name"
5
splattne

私は今これを試しています:どうやらディレクトリでインデックスを有効にしている場合、ファイルのロックに問題があるかもしれません。 http://www.richard-banks.org/2008/04/how-to-fix-problems-with-locked-files.html

これはIIS 6.0ですが、これはOSに関連しているようで、IISではないため、根本的な原因である可能性があります。

2
Morten

Process Monitor は調査に役立ちます。ここに がMarkのブログから(the男それはファイルハンドルを見つける方法についてのツールを書いた)。

ファイルハンドルレベルでのロック解除を自動化するには、この nlockerツール を試してみてください。

1
Nick Kavadias

答えではありませんが、IIS server:

新しい空のフォルダーにビルド/デプロイし、Webサイトのホームディレクトリをそのフォルダーに変更するとどうなりますか?ただし、新しいフォルダ名を作成するか、2つの名前を切り替える必要があります。

そのファイルがどのフォルダにあるのかわかりません。ルートフォルダーにある必要がない場合は、新しく作成したフォルダーに入れて、そのフォルダーを指す仮想ディレクトリを作成できます。したがって、アプリケーションの標準ホームディレクトリを保持できます。

1
splattne

同じ問題がありました。 MSDeploy(Web Deploy)に切り替えたので、何も停止することなくWebサイトを確実に更新できます。実際、このステップは自動ビルドツールでスクリプト化されており、問題なく常に発生します。そして、それも速いです。

1

確かに、IISサービスを停止します。たぶん私は何かを理解していません、すみません。

0
Mark Allen

注: Windowsファイルロックセマンティクスの専門家ではありません

ジャロッド、邪魔にならないようにファイルの名前を変更できますか?また、一時的な拡張子を持つ新しいファイルを作成し、現在のファイルに上書きすることもできます。

WindowsファイルロックのセマンティクスがPOSIXのものと同様に機能する場合、ファイルの現在の読み取りロックを保持しているリーダーは、読み取りストリームを閉じるまで古いファイルを提供し続けますが、新しいリーダーは新しいファイルを開きます。

0
Dave Cheney