Як змусити IIS7 звільнити заблокований файл?


25

Під час створення наших виробничих процесів дуже великий (10 мегабайт) статичний файл вмісту в кореневому каталозі іноді блокується IIS і не може бути видалений завданням очищення. Імовірно, це тому, що його активно обслуговують один або кілька клієнтів у той час.

Процес збирання зупиняє веб-сайт перед чищенням через

c:\Windows\System32\inetsrv\appcmd.exe stop site http://oursite.com

Однак це не випускає файл - нам доведеться перезапустити IIS, щоб процес відмовився від його блокування.

appcmd.exeдозволяє повністю зняти IIS; ми не хочемо цього робити!

Чи є інші способи змусити IIS відпустити заблокований файл, не перезавантажуючи IIS? Просто вимкнути та запустити окремий веб-сайт, безумовно, не працює, щоб випустити блокування файлів.


1
Серйозне питання зараз: чи змінюється цей статичний файл від збирання до збирання чи це просто файл, який ніколи не зміниться?
— splattne

Просто божевільна думка, але мені цікаво, що буде, якби ви включили Shadow Copies в цій папці?
— Річард Вест

Це ваш sitemap.xml, правильно?
— Дейв Чейні

Так, це був наш sitemap.xml, але тепер у нас просто маршрут MVC до нього і зберігати присоски в пам'яті. Більше немає блокування!
— Jarrod Dixon

Відповіді:


12

Існують такі інструменти, як «Провідник процесів Sysinternal», які можуть знайти та примусово закрити ручки файлів, однак стан та поведінка програми (як вашої, так і в цьому випадку IIS) після цього не визначено. Деяким буде байдуже, іншим буде помилка, а іншим буде важко вийти з ладу.

Правильне рішення - зняти зрив і дозволити IIS чисто звільнити блокування та очистити після себе, щоб зберегти стабільність сервера. Якщо це неможливо, ви можете або створити інший сайт у цьому ж вікні, або встановити нове поле з новим вмістом і перемістити доменне ім’я / IP впоперек, щоб "просувати" новий вміст у виробництво.


2
+1 для провідника процесів, він може дати вам уявлення про можливість вирішити проблему, якщо ви зможете побачити, яка нитка тримає ручку файлу відкритою
— Nick Kavadias

Можливо, дуже корисно випущений заблокований файл програмно за допомогою інструментів Sysinternals з Powershell , C # або скриптами bat-cmd
— Kiquenet

У мене є IIS, щоб розблокувати файл або каталог, просто намагаючись скопіювати файли в папку, що контролюється IIS, а потім переглядати веб-додаток у браузері. Іноді цей процес відмикає ці ручки.
— Марк полудень

13

Для цього я використовую невеликий інструмент під назвою "Ручка" .

Ви в основному передаєте йому ім'я закритого файлу, і він повідомляє вам, які процеси використовують його:

handle c:\weird.file
Something.exe pid: 1000 100: C:\weird.file
Something.exe pid: 1000 101: C:\weird.file

Потім ви передаєте йому перемикач -c, щоб закрити ручку:

handle.exe -c 101 -p 1000 -y
handle.exe -c 100 -p 1000 -y

Ви можете намагатися працювати над цим сценарієм зборки без програми обгортки для розбору результатів, але, сподіваємось, це допоможе.


Могутній Марк Русинович на допомогу - я це перевірю, але відверте попередження Генделя про нестабільність програми при насильницькому закриванні ручки викликає в мене нервовість.
— Jarrod Dixon

Сподіваємось, будь-яка нестабільність буде обмежена питанням AppPool. Якщо це так, то ви можете просто зробити перезапуск AppPool після звільнення блокування.
— Саймон Джонсон

@ Jarrod: будь-яка удача? Чи можете ви опублікувати будь-які результати, аж до оригіналу, будь ласка? я б хотів побачити, що відбувається тут, за лаштунками.
— Pure.Krome

Можливо, дуже корисно випущений заблокований файл програмно, використовуючи Handle with Powershell , C # або скрипти bat-cmd та отримуйте процеси, які блокують папку
— Kiquenet

5

Я не впевнений, якщо ви маєте на увазі компіляцію файлів aspx у тимчасових збірках. Ми використовуємо проекти розгортання ASP.NET , які попередньо компілюють всі файли aspx / ascx.

Копіюючи двійкові файли з папки "опублікувати" у папку "бін", ми тимчасово включаємо файл app_offline.htm, який видаляється після копіювання всіх збірок (всього кілька секунд). Таким чином я ніколи не відчував блокування файлів.

Редагувати:

Ви можете спробувати переробити пул додатків за допомогою appcmd.exe, а не зупиняти веб-сайт:

C:\Windows\System32\inetsrv\appcmd.exe recycle apppool "My App Pool Name"

1
Ні, це лише статичний файл вмісту в кореневому каталозі - оновлення питання з цією інформацією!
— Jarrod Dixon

1
Я думаю, ви використовуєте app_offline.htm під час виконання вашої роботи зі збирання?
— splattne

Я думаю, що ми спробували переробляти вручну безрезультатно, але спробуємо повторити наступного разу, коли з’явиться замок (пули програм призначені для .NET, правда, напевно, тут не допоможе). У нас раніше був створений файл app_offline.htm, але це не допомогло з блокуванням - саме тому ми перейшли до того, щоб знімати окремий сайт.
— Jarrod Dixon

Боюся, ти маєш рацію. Я перевірю це на одному з наших серверів і повернусь до вас.
— splattne

1
@splattne: Переробка пулу додатків повинна була видалити ручку за умови відкриття файлу веб-сайтом. Якщо переробка пулу не допомагає, то я гадаю, що файл ще щось заблокує.
— pbz


1

Process Monitor повинен допомогти вам з вашим розслідування, ось приклад з блогу Марка ( на хлопця , який написав інструмент) про те , як знайти дескриптор файлу.

Ви можете спробувати цей інструмент Unlocker для автоматизації розблокування на рівні обробки файлів.


Класно, я ніколи не використовував Process Monitor; але кожна робоча станція, яку я використовую, одразу отримує Process Explorer! technet.microsoft.com/en-us/sysinternals/bb896653.aspx
— Jarrod Dixon

1

Не відповідь, а обхідна ідея, якщо немає можливості "розблокувати" цей файл без перезавантаження сервера IIS:

Що робити, якщо ви створили / розгорнули нову порожню папку та змінили домашній каталог веб-сайту на цю папку? Вам потрібно створити нове ім'я папки, або переключитися між двома іменами.

Я не знаю, до якої папки належить цей файл. Якщо вона не повинна бути в кореневій папці, ви можете помістити її в новостворену папку і створити віртуальний каталог, що вказує на цю папку. Таким чином, ви можете зберегти свій стандартний домашній каталог для програми.


1

У мене була така ж проблема. Тепер я перейшов на MSDeploy (Web Deploy) , і тепер я можу надійно оновити веб-сайт, не зупиняючи нічого. Насправді цей крок написаний у нашому автоматизованому інструменті збирання, і він відбувається постійно без проблем. І це теж швидко.


0

Звичайно, зупиніть службу IIS. Можливо, я чогось не розумію, вибачте.


2
Якщо ви зупиняєте службу IIS, ви
— знімете

Це одне, чого ми справді хочемо уникати, оскільки ми не хочемо, щоб наш сайт CruiseControl.NET зайшов - ми натискаємо на цю кнопку «Оновити статус», як безумці під час складання, щоб перевірити на успіх!
— Jarrod Dixon

Гаразд, як спочатку побудувати десь ще, а потім розгорнути статичний файл, а не робити все на цьому сервері?
— Марк Аллен

чи не в цьому питання? Ніхто не сказав, що файл змінюється програмним забезпеченням на самому сервері.
— FlavorScape

0

Примітка: не експерт з семантики блокування файлів Windows

Jarrod, чи зможеш ти перейменувати файл із шляху. Ви також можете створити новий файл із тимчасовим розширенням, а потім перейменувати його на поточний файл.

Якщо семантика блокування файлів Windows працює аналогічно POSIX, то читачі, які містять поточне блокування читання у файлі, повинні продовжувати обслуговувати старий файл, поки вони не закриють свої потоки читання, тоді як нові читачі відкриють новий файл.


Ні, ми не можемо нічого зробити з файлом, поки IIS не буде перезапущено.
— Jarrod Dixon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.