IIS - 通过w3wp.exe释放文件夹的句柄,以便可以重命名

时间:2015-03-19 15:23:37

标签: batch-file iis tfs tfsbuild w3wp

我有一个TFS构建过程,它会丢弃沙箱上的输出,沙盒是同一网络中的另一台服务器。换句话说,构建代理和沙箱是单独的机器。创建输出后,构建模板中定义的批处理脚本执行以下操作:

  • 将现有部署文件夹重命名为某个前缀+时间戳(当用户尝试访问时,IIS现在无法再找到该应用)
  • 将新创建的输出移至部署位置

我想重命名和移动文件而不是复制/删除/覆盖的原因是后者花了很多时间,因为我们有这么多文件(超过5500)。我试图找到一种方法,在尽可能短的时间内完成构建,以提高开发人员的工作效率。我希望创建一个Windows服务来定期删除转储文件夹和删除文件夹工件,这样沙盒就不会填满。

我遇到的问题是IIS维护原始部署文件夹的句柄,因此批处理脚本无法重命名它。我使用Process Explorer来查看正在使用该文件夹的进程。它是w3wp.exe,它是我的应用所在的应用程序池的工作进程。我在重命名文件夹之前尝试杀死所有w3wp.exe实例,但这不起作用。然后我决定停止应用程序池,重命名该文件夹,然后重新启动它。这也不起作用。

在任何一种情况下,Process Explorer都显示我的输出仍有未收集的句柄,但这次所有者名称不是w3wp.exe,但这是一个未知的过程。有一次,我看到所有者是System,但是杀死System的进程树会关闭服务器。

有没有办法正确删除部署文件夹的所有句柄,以便批处理脚本可以安全地重命名它?

2 个答案:

答案 0 :(得分:0)

https://technet.microsoft.com/en-us/sysinternals/bb896655.aspx

使用名为Handle v4.0的Windows系统工具

答案 1 :(得分:0)

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

正确的解决方案是允许IIS干净地释放锁并自行清理以保持服务器稳定性。如果无法做到这一点,您可以在同一个盒子上创建另一个站点,或者设置一个包含新内容的新盒子,并移动域名/ IP以“将新内容”“提升”为生产