我的一台 Windows 2008 R2 Web 版服务器上反复出现一个烦人的问题。有问题的驱动器恰好是 SSD,但我怀疑这无关紧要。
我有一个脚本,当我想重新部署网站代码时,我会运行它。脚本的第一行如下所示:
rmdir C:\websites\www.mywebsite-test.com /s /q
有时运行该行时,它会正常工作,但有时目录会以某种方式损坏。发生这种情况时,无论我对目录执行什么操作,我(作为管理员)都会被拒绝访问 - 无法打开、删除、移动它(资源管理器或命令行)、获取所有权等。我相信原因是目录实际上不再存在,但有关它的某些东西仍然存在,使其仍然显示在资源管理器和命令行中。如果我重新启动服务器,当我重新登录时,损坏的目录就会消失。之后一切都很好:我重新运行脚本,第一行响应无法找到目录的警告,然后它继续并正常部署。
我最后两次运行此脚本时都发生了这种情况。之前运行相同的脚本时没有任何问题。我有另一个部署生产代码的脚本,该脚本的第一行相同,但没有“-test”。我从未遇到过 prod 脚本的问题,尽管它运行的次数较少。两个目标目录都是 IIS 7.5 应用程序目录。
我想知道当损坏的目录发生时我可以做些什么,以便我不必重新启动?Windows 在重新启动时做了什么,最终导致目录消失?我想在没有重新启动的情况下模拟这种情况。重新启动不是什么大问题,但因为我的一个测试目录混乱而导致整个服务器停机 60 秒是非常烦人的。
当然,一个相关的问题是,为什么会发生这种情况?
答案1
目录未“损坏”。您有一个指向该目录或该目录下项目的打开句柄,并且直到关闭该句柄后才能完成删除。
您可以使用SysInternals 句柄实用程序列出机器上的打开句柄并找到具有打开句柄的进程。如果您可以让该进程关闭句柄(或只是终止该进程),您将看到删除完成。