在我们的生产构建期间,根目录中的一个非常大(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 以将新内容“推广”到生产中。
我不确定您是否指的是在临时程序集中编译 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)
| 归档时间: |
|
| 查看次数: |
56873 次 |
| 最近记录: |