如何使IIS7释放锁定的文件?


25

在我们的生产构建过程中,根目录中的一个非常大的静态内容文件(10兆字节)有时会被IIS锁定,并且不能由clean任务删除。据推测这是因为当时正在积极地为一个或多个客户提供服务。

构建过程会先停止网站,然后再通过进行清理

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

但是,这不会释放文件-我们必须重新启动IIS,以使进程放弃它的锁。

appcmd.exe允许您完全关闭IIS;我们希望这样做!

是否有其他方法可以让IIS释放锁定的文件,而无需重新启动IIS?仅仅停止和启动单个网站绝对不能解除文件锁定。


1
现在是一个严重的问题:此静态文件会在构建之间进行更改,还是只是一个永不更改的文件?
splattne

只是一个疯狂的想法,但是我想知道如果在此文件夹上启用卷影副本会怎样?
理查德·韦斯特2009年

这是您的sitemap.xml吗?
戴夫·切尼

是的,那是我们的sitemap.xml,但是现在我们只有一条MVC路由可以将它存储在内存中。没有更多的锁定!
Jarrod Dixon

Answers:


12

有一些工具,例如Sysinternal的Process Explorer,可以找到并强制关闭文件句柄,但是执行此操作后,应用程序的状态和行为(包括您本人,在本例中为IIS)是不确定的。有些人不在乎,有些人会出错,而另一些人会崩溃。

正确的解决方案是停止运行,并允许IIS干净地释放锁,并在其自身清理之后保持服务器稳定性。如果无法做到这一点,则可以在同一框上创建另一个站点,或者用新内容设置一个新框,然后将域名/ IP移至“将”新内容“推广”到生产环境中。


2
为进程浏览器+1,如果您看到哪个线程正在使文件句柄保持打开状态,则可能为您提供一些解决问题的能力
Nick Kavadias 2009年

也许非常有用,可以使用Sysinternals工具通过PowershellC#脚本bat-cmd编程方式释放锁定文件
Kiquenet 2015年

我已经拥有IIS来解锁文件或目录,只需尝试将文件复制到该IIS控制的文件夹中,然后在浏览器中查看该Web应用程序即可。有时,此过程会解锁那些句柄。
Marc Noon

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发出程序不稳定的可怕警告令我感到紧张。
Jarrod Dixon

希望任何不稳定性将仅限于所讨论的AppPool。在这种情况下,您可以在释放锁定后重新启动AppPool。
西蒙·约翰逊

// @贾罗德:有运气吗?请问您能发表任何结果吗?我很想看看幕后发生的事情。
Pure.Krome,2009年

也许非常有用,可以使用带有Powershell的HandleC#脚本bat-cmd编程方式释放锁定文件 ,并获取锁定文件夹的进程
Kiquenet

5

我不确定您是否要在临时程序集中编译aspx文件。我们正在使用ASP.NET部署项目,这些项目会预先预编译所有aspx / ascx文件。

将二进制文件从“发布”复制到“ bin”文件夹时,我们临时启用了一个app_offline.htm文件,该文件在复制所有程序集后将被删除(仅几秒钟)。这样,我就从未经历过文件锁定。

编辑:

您可以尝试使用appcmd.exe回收应用程序池,而不是停止网站:

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

1
不,这只是根目录中的静态内容文件-使用该信息更新问题!
贾罗德·迪克森

1
我猜您在执行构建作业期间正在使用app_offline.htm吗?
splattne,2009年

我认为我们已经尝试过手动回收,但无济于事,但是下次有锁时,我们将再次尝试(应用程序池用于.NET,对吗?可能对这里没有帮助)。我们曾经创建过app_offline.htm文件,但是它对锁定没有帮助-这就是为什么我们着手删除单个站点。
Jarrod Dixon

恐怕你是对的。我将在我们的一台服务器上对此进行测试,然后再回头给您。
splattne

1
@splattne:如果网站打开了文件,那么回收应用程序池应该已经删除了句柄。如果回收池无济于事,那么我的猜测是还有其他东西会锁定文件。
pbz



1

不是答案,而是一种解决方法,以防万一没有重新启动IIS服务器就无法“解锁”该文件:

如果您构建/部署到一个新的空文件夹并将网站的主目录更改为该文件夹怎么办?您必须创建一个新的文件夹名称,或者在两个名称之间切换。

我不知道该文件属于哪个文件夹。如果不必将其放在根文件夹中,则可以将其放在新创建的文件夹中,并创建指向该文件夹的虚拟目录。因此,您可以保留应用程序的标准主目录。


1

我有同样的问题。现在,我切换到MSDeploy(Web Deploy),现在我可以可靠地更新网站,而无需停止任何操作。实际上,此步骤是在我们的自动生成工具中编写的,并且始终可以无问题地进行。而且速度也很快。


0

当然,请停止IIS服务。抱歉,我可能听不懂。


2
如果要停止IIS服务,则将关闭所有网站...
splattne

那是我们真正要避免的一件事,因为我们不想我们的CruiseControl.NET网站崩溃-我们在构建过程中像疯子一样单击“刷新状态”按钮来检查成功!
Jarrod Dixon

好的,首先在其他地方构建,然后在静态文件上部署而不是在该服务器上执行所有操作的方式如何?
Mark Allen

这不是这里的问题吗?没有人说文件被服务器本身的软件修改了。
FlavorScape 2012年

0

注意:不是Windows文件锁定语义方面的专家

Jarrod,您能否重命名文件。您也许还可以使用临时扩展名创建新文件,然后在当前文件上重命名。

如果Windows文件锁定语义的工作方式与POSIX相似,则在文件上拥有当前读取锁定的读取器仍应继续提供旧文件,直到它们关闭读取流,而新读取器将打开新文件。


不,直到重新启动IIS,我们才能对文件执行任何操作。
贾罗德·迪克森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.