我有一个TFS构建过程,它会丢弃沙箱上的输出,沙盒是同一网络中的另一台服务器。换句话说,构建代理和沙箱是单独的机器。创建输出后,构建模板中定义的批处理脚本执行以下操作:
我想重命名和移动文件而不是复制/删除/覆盖的原因是后者花了很多时间,因为我们有这么多文件(超过5500)。我试图找到一种方法,在尽可能短的时间内完成构建,以提高开发人员的工作效率。我希望创建一个Windows服务来定期删除转储文件夹和删除文件夹工件,这样沙盒就不会填满。
我遇到的问题是IIS维护原始部署文件夹的句柄,因此批处理脚本无法重命名它。我使用Process Explorer
来查看正在使用该文件夹的进程。它是w3wp.exe
,它是我的应用所在的应用程序池的工作进程。我在重命名文件夹之前尝试杀死所有w3wp.exe
实例,但这不起作用。然后我决定停止应用程序池,重命名该文件夹,然后重新启动它。这也不起作用。
在任何一种情况下,Process Explorer
都显示我的输出仍有未收集的句柄,但这次所有者名称不是w3wp.exe
,但这是一个未知的过程。有一次,我看到所有者是System
,但是杀死System的进程树会关闭服务器。
有没有办法正确删除部署文件夹的所有句柄,以便批处理脚本可以安全地重命名它?
答案 0 :(得分:0)
https://technet.microsoft.com/en-us/sysinternals/bb896655.aspx
使用名为Handle v4.0的Windows系统工具
答案 1 :(得分:0)
像Process Explorer
这样的工具可以找到并强制关闭文件句柄,但是在执行此操作之后,应用程序(包括您的,在本例中为IIS)的状态和行为是未定义的。有些人不在乎,有些人会出错,有些人会很难过。
正确的解决方案是允许IIS干净地释放锁并自行清理以保持服务器稳定性。如果无法做到这一点,您可以在同一个盒子上创建另一个站点,或者设置一个包含新内容的新盒子,并移动域名/ IP以“将新内容”“提升”为生产