Як змусити 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.