Frage Wie erhalte ich IIS7, um eine gesperrte Datei freizugeben?


Während unserer Produktions-Builds wird eine sehr große (10 Megabyte) statische Inhaltsdatei im Stammverzeichnis manchmal von IIS gesperrt und kann von der Bereinigungstask nicht gelöscht werden. Dies liegt vermutlich daran, dass es zu diesem Zeitpunkt aktiv an einen oder mehrere Clients geliefert wird.

Der Build-Prozess stoppt die Website vor der Reinigung über

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

Dies jedoch nicht Die Datei freigeben - wir müssen IIS neu starten, damit der Prozess seine Sperre aufgibt.

appcmd.exe ermöglicht es Ihnen, IIS vollständig zu entfernen; wir unterlassen Sie will das machen!

Gibt es andere Möglichkeiten, IIS zu veranlassen, eine gesperrte Datei loszulassen, ohne IIS neu zu starten? Das einfache Stoppen und Starten der einzelnen Website funktioniert definitiv nicht, um die Dateisperre freizugeben.


25
2018-05-10 06:59


Ursprung


Ernsthafte Frage jetzt: ändert sich diese statische Datei von Build zu Build oder ist es nur eine Datei, die sich niemals ändert? - splattne
Nur ein verrückter Gedanke, aber ich frage mich, was passieren würde, wenn Sie Schattenkopien für diesen Ordner aktivieren würden? - Richard West
Das ist deine sitemap.xml richtig? - Dave Cheney
Ja, es war unsere sitemap.xml, aber jetzt haben wir nur eine MVC-Route und speichern den Sucker im Speicher. Kein Sperren mehr! - Jarrod Dixon♦


Antworten:


Es gibt Tools wie den Process Explorer von Sysinternal, mit denen Dateihandles gefunden und zwangsweise geschlossen werden können. Der Status und das Verhalten der Anwendung (sowohl Ihre als auch in diesem Fall IIS) sind jedoch nicht definiert. Manche werden es nicht kümmern, manche werden Fehler und andere werden schwer zusammenbrechen.

Die richtige Lösung besteht darin, den Ausfall zu beheben und es IIS zu ermöglichen, Sperren sauber freizugeben und nach sich selbst aufzuräumen, um die Serverstabilität zu erhalten. Wenn dies nicht möglich ist, können Sie entweder eine andere Site auf derselben Box erstellen oder eine neue Box mit dem neuen Inhalt einrichten und den Domänennamen / die IP-Adresse verschieben, um den neuen Content für die Produktion zu "promoten".


12
2018-05-10 10:35



+1 für den Prozess-Explorer, kann es Ihnen einen Einblick geben, wie Sie das Problem lösen können, wenn Sie sehen können, welcher Thread das Datei-Handle offen hält - Nick Kavadias
Vielleicht sehr nützlich veröffentlicht gesperrte Datei  programmatisch Verwenden von Sysinternals-Tools mit Power Shell, C # oder Skripte bat-cmd - Kiquenet
Ich habe IIS, um die Datei oder das Verzeichnis zu entsperren, einfach indem ich versuche, Dateien in diesen IIS-gesteuerten Ordner zu kopieren und dann die Web-App in einem Browser anzuzeigen. Manchmal entsperrt dieser Prozess diese Punkte. - Marc Noon


Ich benutze ein kleines Werkzeug namens "Griff" um dies zu tun.

Sie übergeben ihm im Prinzip den Namen der gesperrten Datei und sagen Ihnen, welche Prozesse ihn verwenden:

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

Dann übergeben Sie den Schalter -c, um den Griff zu schließen:

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

Es könnte schwerfallen, das in einem Build-Skript ohne ein Wrapper-Programm zu verarbeiten, um die Ausgabe zu parsen, aber hoffentlich wird dies helfen.


12
2018-05-11 13:31



Der mächtige Mark Russinovich zur Rettung - ich werde das überprüfen, aber Handles düstere Warnung vor Programm-Instabilität beim gewaltsamen Schließen eines Griffs macht mich nervös. - Jarrod Dixon♦
Hoffentlich wird sich jede Instabilität auf den fraglichen AppPool beschränken. Wenn dies der Fall ist, können Sie den AppPool einfach neu starten, nachdem Sie die Sperre aufgehoben haben. - Simon Johnson
@ Jarrod: Irgendwas Glück? Könnten Sie bitte irgendwelche Ergebnisse in Ihren ursprünglichen Post posten? Ich würde gerne sehen, was hier passiert, hinter den Kulissen. - Pure.Krome
Vielleicht sehr nützlich veröffentlicht gesperrte Datei  programmatisch verwenden Griff mit Power Shell, C # oder Skripte bat-cmd und Abrufen von Prozessen, die einen Ordner sperren - Kiquenet


Ich bin mir nicht sicher, ob Sie die Zusammenstellung von ASPX-Dateien in temporären Baugruppen meinen. Wir benutzen ASP.NET-Bereitstellungsprojekte, die vorher alle aspx / ascx Dateien vorkompilieren.

Beim Kopieren der Binärdateien aus dem Ordner "publish" in den Ordner "bin" aktivieren wir temporär eine Datei app_offline.htm, die nach dem Kopieren aller Assemblies entfernt wird (nur wenige Sekunden). So habe ich nie Dateisperren erlebt.

BEARBEITEN:

Sie können versuchen, den App-Pool mithilfe von appcmd.exe zu recyceln, anstatt die Website anzuhalten:

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

5
2018-05-10 07:09



Nein, es ist nur eine statische Inhaltsdatei im Stammverzeichnis - Aktualisieren der Frage mit dieser Information! - Jarrod Dixon♦
Ich nehme an, Sie verwenden die App_offline.htm während der Ausführung Ihres Build-Jobs? - splattne
Ich denke, wir haben versucht, manuell ohne Erfolg zu recyceln, aber wir werden es beim nächsten Mal wieder versuchen, wenn es eine Sperre gibt (App-Pools sind für .NET, richtig? Wird wahrscheinlich hier nicht helfen). Und wir haben die app_offline.htm-Datei erstellt, aber sie hat uns nicht beim Sperren geholfen - weshalb wir die einzelne Seite heruntergefahren haben. - Jarrod Dixon♦
Ich fürchte, du hast Recht. Ich werde das auf einem unserer Server testen und zu dir zurückkommen. - splattne
@splattne: Wenn der Anwendungspool wiederverwendet wurde, sollte der Handle entfernt werden, sofern die Datei von der Website geöffnet wurde. Wenn das Recyclen des Pools nicht hilft, denke ich, dass etwas anderes die Datei sperrt. - pbz


Ich probiere das jetzt aus: Anscheinend könnte es Probleme mit der Dateisperrung geben, wenn Sie die Indexierung für das Verzeichnis aktiviert haben. http://www.richard-banks.org/2008/04/how-to-fix-problems-with-locked-files.html

Dies ist IIS 6.0, aber da dies mit dem Betriebssystem und nicht mit IIS in Verbindung zu stehen scheint, könnte dies die Hauptursache sein.


2
2018-05-31 13:16





Prozessüberwachung sollte Ihnen bei Ihrer Untersuchung helfen, hier ist ein Beispiel aus Marks Blog (das Mann, der das Tool geschrieben hat), wie man den Dateigriff findet.

Vielleicht möchten Sie dies versuchen Unlocker-Werkzeug um das Entsperren auf Dateiebene zu automatisieren.


1
2018-05-10 15:01



Cool, ich habe noch nie Process Monitor benutzt; aber jeder Arbeitsplatz, den ich sofort benutze, bekommt Process Explorer! technet.microsoft.com/en-us/sysinternals/bb896653.aspx - Jarrod Dixon♦


Nicht die Antwort, sondern eine Umgehungslösung für den Fall, dass es keine Möglichkeit gibt, diese Datei zu entsperren, ohne den IIS-Server neu zu starten:

Was passiert, wenn Sie einen neuen leeren Ordner erstellen / bereitstellen und das Home-Verzeichnis der Website in diesen Ordner ändern? Sie müssen jedoch einen neuen Ordnernamen erstellen oder zwischen zwei Namen wechseln.

Ich weiß nicht, in welchem ​​Ordner diese Datei gehört. Wenn es sich nicht im Stammordner befinden muss, können Sie es in einem neu erstellten Ordner speichern und ein virtuelles Verzeichnis erstellen, das auf diesen Ordner verweist. So können Sie Ihr Standard-Home-Verzeichnis für die Anwendung behalten.


1
2018-05-10 15:17





Sicher, stoppe den IIS-Dienst. Vielleicht verstehe ich etwas nicht, sorry.


0
2018-05-10 07:47



Wenn Sie den IIS-Dienst anhalten, werden alle Websites entfernt ... - splattne
Das ist die eine Sache, die wir wirklich vermeiden wollen, da wir nicht wollen, dass unsere CruiseControl.NET-Seite herunterkommt - wir klicken auf den "Aktualisierungsstatus" -Knopf wie verrückt während eines Builds, um nach Erfolg zu suchen! - Jarrod Dixon♦
Ok, wie wäre es, wenn du zuerst woanders baust und dann über die statische Datei verteilt anstatt alles auf diesem Server zu tun? - Mark Allen
Ist das nicht das Problem hier? Niemand sagte, dass die Datei von Software auf dem Server selbst geändert wurde. - FlavorScape


Hinweis: kein Experte für Windows-Datei Sperren Semantik

Jarrod, kannst du die Datei aus dem Weg räumen? Möglicherweise können Sie Ihre neue Datei auch mit einer temporären Erweiterung erstellen und sie dann über der aktuellen Datei umbenennen.

Wenn die Windows-Dateisynchronisierungssemantik ähnlich wie bei POSIX funktioniert, sollten die Leser, die eine aktuelle Lesesperre für die Datei besitzen, weiterhin die alte Datei bedienen, bis sie ihre Leseströme schließen, während neue Leser die neue Datei öffnen.


0
2018-05-10 09:42



Nein, wir können nichts mit der Datei tun, bis IIS neu gestartet wird. - Jarrod Dixon♦