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

Jar*_*xon 26 files iis iis-7

在我们的生产构建期间,根目录中的一个非常大(10 兆字节)的静态内容文件有时会被 IIS 锁定,并且无法被清理任务删除。这大概是因为它当时正在积极地为一个或多个客户提供服务。

构建过程在通过清理之前停止网站

c:\Windows\System32\inetsrv\appcmd.exe stop site http://oursite.com
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sim*_*son 13

我使用一个名为“处理”的小工具来做到这一点。

您基本上将锁定文件的名称传递给它,它会告诉您哪些进程正在使用它:

handle c:\weird.file
Something.exe pid: 1000 100: C:\weird.file
Something.exe pid: 1000 101: C:\weird.file
Run Code Online (Sandbox Code Playgroud)

然后将 -c 开关传递给它以使其关闭手柄:

handle.exe -c 101 -p 1000 -y
handle.exe -c 100 -p 1000 -y
Run Code Online (Sandbox Code Playgroud)

您可能很难在没有包装程序的情况下将其用于构建脚本来解析输出,但希望这会有所帮助。


Gre*_*ork 12

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

正确的解决方案是采取中断并允许 IIS 干净地释放锁定并在其自身之后进行清理以保持服务器稳定性。如果这是不可能的,您可以在同一个盒子上创建另一个站点,或者设置一个包含新内容的新盒子,然后移动域名/IP 以将新内容“推广”到生产中。

  • +1 对于进程资源管理器,如果您能看到哪个线程保持文件句柄打开,它可能会让您对解决问题有一些了解 (2认同)

spl*_*tne 5

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

在将二进制文件从“publish”复制到“bin”文件夹时,我们临时启用了一个 app_offline.htm 文件,该文件在复制所有程序集后(只需几秒钟)就会被删除。这样我从来没有遇到过文件锁。

编辑:

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

C:\Windows\System32\inetsrv\appcmd.exe recycle apppool "My App Pool Name"
Run Code Online (Sandbox Code Playgroud)