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



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

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

我之所以想重命名和移动文件,而不是复制/删除/覆盖,是因为后者需要很多时间,因为我们有太多的文件(超过5500个)。我正试图找到一种在尽可能短的时间内完成构建的方法,以提高开发人员的生产力。我希望创建一个windows服务来定期删除转储文件夹和丢弃文件夹工件,这样沙箱就不会满了。

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

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

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

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

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

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

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

最新更新