У меня периодически возникает неприятная проблема на одном из серверов Windows 2008 R2 Web Edition. Речь идет о твердотельном накопителе, хотя я сомневаюсь, что это имеет значение.
У меня есть сценарий, который я запускаю, когда хочу повторно развернуть код веб-сайта. Первая строка скрипта выглядит так:
rmdir C: \ sites \ www.mywebsite-test.com / s / q
Иногда, когда эта строка запускается, она работает нормально, иногда каталог каким-то образом повреждается. Когда это происходит, я, как администратор, получаю отказ в доступе независимо от того, что я делаю с каталогом - не могу его открыть, удалить, переместить (проводник или командная строка), стать владельцем и т. Д. Я считаю, что причина в том, что Каталог на самом деле больше не существует, но что-то в нем висит, заставляя его по-прежнему отображаться в проводнике и командной строке. Если я перезагружаю сервер, когда я снова вхожу в поврежденный каталог, он исчезает. После этого все в порядке: я перезапускаю свой скрипт, первая строка отвечает предупреждением, что каталог не может быть найден, а затем он продолжается и развертывается в обычном режиме.
Это случилось последние два раза, когда я запускал этот скрипт. Ранее тот же сценарий выполнялся без проблем. У меня есть другой сценарий, который разворачивает производственный код с той же первой строкой, за исключением «-test». У меня никогда не было проблем со скриптом prod, хотя он запускается реже. Оба целевых каталога - это каталоги приложений IIS 7.5.
Я хотел бы знать, могу ли я что-нибудь сделать с поврежденным каталогом, когда это произойдет, чтобы мне не пришлось перезагружаться? Что делает Windows при перезагрузке, из-за чего каталог, наконец, уходит? Я бы хотел смоделировать это без перезагрузки. Перезагрузка - не такая уж большая проблема, но отключение всего сервера на 60 секунд из-за того, что один из моих тестовых каталогов испорчен, довольно раздражает.
Конечно, возникает связанный с этим вопрос: почему это вообще происходит?
Каталог не «поврежден». У вас есть открытый дескриптор элемента в этом каталоге или ниже, и пока дескриптор не будет закрыт, удаление не может быть завершено.
Вы можете использовать SysInternals handle.exe утилита для вывода списка открытых дескрипторов на машине и поиска процесса с открытым дескриптором. Если вы можете заставить этот процесс закрыть дескриптор (или просто завершить процесс), вы увидите, что удаление завершено.