2015-03-19 4 views
0

У меня есть процесс сборки TFS, который выводит выходы на песочнице, которая является другим сервером в той же сети. Другими словами, агент сборки и песочница являются отдельными машинами. После создания выходов, пакетный сценарий определяется в шаблоне сборки делает следующее:IIS - Отправка дескриптора в папку с помощью w3wp.exe, чтобы его можно было переименовать.

  • Переименовать существующую папку развертывания в какой-то префикс + метки времени (IIS не может теперь уже не найти приложение, когда пользователи пытаются получить доступ к нему)
  • Move вновь созданные выходы в месте развертывания

причина, почему я хотел переименовывать и перемещать файлы вместо копирования/удаления/перезаписи является последний занимает много времени, потому что у нас есть так много файлов (более 5500). Я пытаюсь найти способ завершить сборку в кратчайшие сроки, чтобы увеличить производительность разработчика. Я надеюсь создать службу Windows, чтобы периодически удалять папки дампа и периодически удалять артефакты папок, поэтому песочница не заполняется.

Проблема, с которой я столкнулась, заключается в том, что IIS поддерживает дескриптор исходной папки развертывания, поэтому пакетный скрипт не может переименовать его. Я использовал Process Explorer, чтобы узнать, какой процесс использует папка. Это w3wp.exe, который является рабочим процессом для пула приложений, в котором находится мое приложение. Я пытался убить все w3wp.exe экземпляров, прежде чем переименовывать папку, но это не сработало. Затем я решил остановить пул приложений, переименовать папку и запустить ее снова. Это тоже не сработало.

В любом случае Process Explorer показал, что на мои выходы были все еще несохраненные ручки, за исключением того, что имя владельца не было w3wp.exe, но это было что-то вроде линий неопознанного процесса. В какой-то момент я увидел, что владелец был System, но уничтожение дерева процессов System завершает работу сервера.

Есть ли способ правильно удалить все ручки в мою папку развертывания, чтобы пакетный скрипт мог безопасно переименовать его?

+0

_I затем решил остановить пул приложений, переименовать папку ..._ Как он не работал? Я ожидаю, что остановка пула приложений откроет папку. Можете ли вы использовать задачи, описанные здесь http://blogs.msdn.com/b/friis/archive/2009/10/22/which-w3wp-exe-pid-corresponds-to-which-application-pool.aspx. подтвердить, что пул приложений остановлен, как ожидалось? Убивать его не поможет, поскольку IIS создан для автоматического перезапуска разбитых IIS-процессов (в этом случае произошел сбой, потому что вы его убили!). Похоже, вам нужно сделать еще несколько исследований в этом «неопознанном процессе». –

+0

Вы вообще не останавливаете IIS? Если нет, 'iisreset/stop', переименуйте файлы, затем' iisreset/start'. Если вас беспокоит, что ваш веб-сайт отключается во время развертывания, вы можете использовать «webdev.webserver.exe» в Visual Studio как временную замену во время выполнения вашего обслуживания. – rojo

ответ

0

инструментов как Process Explorer, которые могут найти и принудительно закрыть файл ручку, однако состояние и поведение приложения (как ваши, и в этом case, IIS) после этого не определено. Некоторым все равно, кто-то ошибается, а другие сильно рухнут.

Правильное решение - позволить IIS чистить блокировки и очищать после себя, чтобы сохранить стабильность сервера. Если это невозможно, вы можете либо создать другой сайт в том же поле, либо создать новый ящик с новым контентом, либо переместить доменное имя/IP на «продвигать» новый контент на производство