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


25

実稼働ビルド中に、ルートディレクトリ内の非常に大きな(10メガバイト)静的コンテンツファイルがIISによってロックされ、クリーンタスクで削除できないことがあります。これは、その時点で1つ以上のクライアントにアクティブに提供されているためと思われます。

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

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

ただし、これによりファイルが解放されるわけではありません。IISを再起動してプロセスのロックを解除する必要があります。

appcmd.exeIISを完全に停止できます。これはしたくない

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


1
深刻な質問:この静的ファイルはビルドごとに変わるのか、それとも決して変わらない単なるファイルなのか?
飛び散る

ただのクレイジーな考えですが、このフォルダーでシャドウコピーを有効にするとどうなりますか?
リチャードウェスト

これはあなたのsitemap.xmlですよね?
デイブチェイニー

ええ、それは私たちのsitemap.xmlでしたが、今ではMVCルートがあり、吸盤をメモリにキャッシュしているだけです。もうロックはありません!
ジャロッドディクソン

回答:


12

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

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


2
プロセスエクスプローラーの+1。ファイルハンドルを開いたままにしているスレッドを確認できる場合、問題を解決できる可能性があります。
Nick Kavadias 2009年

SysinternalsツールとPowershellC#、またはスクリプトbat-cmdを使用してプログラムでロックれたファイルをリリースすると非常に便利かもしれません
Kiquenet

IISで制御されているフォルダーにファイルをコピーし、ブラウザーでWebアプリを表示するだけで、IISでファイルまたはディレクトリのロックを解除できます。時々、このプロセスはそれらのハンドルのロックを解除します。
マーク正午

13

これを行うには、「ハンドル」と呼ばれる小さなツールを使用します。

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

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

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


強力なMark Russinovichが助けになります-これを確認しますが、ハンドルを強制的に閉じると、Handleがプログラムの不安定性を警告するのは緊張します。
ジャロッドディクソン

不安定性が問題のAppPoolに限定されることを願っています。その場合は、ロックを解除した後にAppPoolを再起動するだけで済みます。
サイモンジョンソン

@ジャロッド:運がいい?元の投稿まで、結果を投稿してください。ここで何が起こっているのか、舞台裏で見たいです。
Pure.Krome

たぶん、非常に便利にリリースロックされたファイル 、プログラムで使用してハンドルをしてPowerShellはC#のまたはスクリプトバット-CMDおよびフォルダのロックのプロセスを取得
Kiquenet

5

一時アセンブリでの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"

1
いいえ、それは単にルートディレクトリ内の静的コンテンツファイルです。その情報で質問を更新します。
ジャロッドディクソン

1
ビルドジョブの実行中にapp_offline.htmを使用していると思いますか?
飛び散る

私たちは手動でリサイクルを試みたが、役に立たなかったと思うが、次回ロックが発生したときに再試行するだろう(アプリプールは。以前はapp_offline.htmファイルを作成していましたが、ロックには役立ちませんでした。そのため、個々のサイトを削除することになりました。
ジャロッドディクソン

私はあなたが正しいことを恐れています。私たちのサーバーの1つでこれをテストし、戻ってきます。
飛び散る

1
@splattne:ファイルがWebサイトによって開かれた場合、アプリケーションプールをリサイクルするとハンドルが削除されます。プールのリサイクルが役に立たない場合、他の何かがファイルをロックしていると思います。
pbz 2009年


1

プロセスモニタは、あなたの調査のお手伝いをする必要があり、ここにあるのMarkさんのブログ(からファイルハンドルを見つける方法でツールを書いた男が)。

このロック解除ツールを試して、ファイルハンドルレベルでロック解除を自動化できます。


クール、私はプロセスモニターを使用したことがありません。しかし、私が使用するすべてのワークステーションはすぐにProcess Explorerを取得します!technet.microsoft.com/en-us/sysinternals/bb896653.aspx
ジャロッドディクソン

1

答えではなく、IISサーバーを再起動せずにそのファイルを「ロック解除」する方法がない場合の回避策です。

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

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


1

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


0

確かに、IISサービスを停止します。多分私は何かを理解していない、ごめんなさい。


2
IISサービスを停止する場合、すべてのWebサイトを停止します
...-splattne

CruiseControl.NETサイトをダウンさせたくないので、これは本当に避けたいことの1つです。ビルド中にmadmenのような[ステータスの更新]ボタンをクリックして、成功を確認します。
ジャロッドディクソン

では、最初に他の場所にビルドしてから、そのサーバーですべてを実行するのではなく、静的ファイルの上に展開してみませんか?
マークアレン

ここで問題になりませんか?ファイルがサーバー自体のソフトウェアによって変更されているとは誰も言いませんでした。
-FlavorScape

0

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

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

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


いいえ、IISを再起動するまで、ファイルに対して何もできません。
ジャロッドディクソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.