Während unserer Produktionserstellung wird eine sehr große (10 Megabyte) statische Inhaltsdatei im Stammverzeichnis manchmal von IIS gesperrt und kann von der Bereinigungsaufgabe nicht gelöscht werden. Dies liegt vermutlich daran, dass es zu diesem Zeitpunkt einem oder mehreren Kunden aktiv zur Verfügung gestellt wird.
Der Build-Prozess stoppt die Website vor der Bereinigung über
c:\Windows\System32\inetsrv\appcmd.exe stop site http://oursite.com
Dies gibt die Datei jedoch nicht frei - wir müssen IIS neu starten, damit der Prozess seine Sperre aufhebt.
appcmd.exe
Ermöglicht das vollständige Herunterfahren von IIS. das wollen wir nicht !
Gibt es andere Möglichkeiten, IIS dazu zu bringen, eine gesperrte Datei loszulassen, ohne IIS neu zu starten? Ein einfaches Stoppen und Starten der einzelnen Website kann die Dateisperre definitiv nicht aufheben.
Antworten:
Es gibt Tools wie den Sysinternal Process Explorer, die Dateihandles finden und zwangsweise schließen können. Der Status und das Verhalten der Anwendung (sowohl Ihre als auch in diesem Fall IIS) ist jedoch nicht definiert. Einige werden sich nicht darum kümmern, einige werden Fehler machen und andere werden schwer abstürzen.
Die richtige Lösung besteht darin, den Ausfall zu beheben und IIS zu ermöglichen, Sperren sauber freizugeben und nach sich selbst aufzuräumen, um die Serverstabilität zu gewährleisten. Wenn dies nicht möglich ist, können Sie entweder eine andere Site in derselben Box erstellen oder eine neue Box mit dem neuen Inhalt einrichten und den Domänennamen / die IP-Adresse verschieben, um den neuen Inhalt für die Produktion zu "bewerben".
quelle
Ich benutze ein kleines Tool namens "Handle" , um dies zu tun.
Sie übergeben ihm im Grunde den Namen der gesperrten Datei und erfahren, welche Prozesse sie verwenden:
Dann geben Sie den Schalter -c ein, um den Griff zu schließen:
Möglicherweise haben Sie Schwierigkeiten, das in ein Build-Skript ohne ein Wrapper-Programm einzuarbeiten, um die Ausgabe zu analysieren, aber hoffentlich hilft dies.
quelle
Ich bin nicht sicher, ob Sie die Kompilierung von Aspx-Dateien in temporären Assemblys meinen. Wir verwenden ASP.NET-Bereitstellungsprojekte , bei denen alle aspx / ascx-Dateien vorkompiliert werden.
Beim Kopieren der Binärdateien aus dem Ordner "publish" in den Ordner "bin" wird vorübergehend eine Datei "app_offline.htm" aktiviert, die nach dem Kopieren aller Assemblys entfernt wird (nur einige Sekunden). Auf diese Weise habe ich noch nie Dateisperren erlebt.
BEARBEITEN:
Sie könnten versuchen, den App-Pool mit appcmd.exe zu recyceln, anstatt die Website zu stoppen:
quelle
Ich probiere das jetzt aus: Anscheinend könnte es Probleme mit der Dateisperrung geben, wenn Sie die Indizierung für das Verzeichnis aktiviert haben. http://www.richard-banks.org/2008/04/wie-behebe- ich- Probleme-mit- gesperrten-Dateien.html
Dies ist IIS 6.0, aber da dies mit dem Betriebssystem und nicht mit IIS zu tun zu haben scheint, ist dies möglicherweise die Hauptursache.
quelle
Process Monitor soll Ihnen bei Ihren Nachforschungen helfen. Hier ist ein Beispiel aus Marks Blog ( der Typ, der das Tool geschrieben hat), wie Sie das Datei-Handle finden.
Sie können dieses Unlocker-Tool verwenden, um das Entsperren auf Dateizugriffsebene zu automatisieren.
quelle
Nicht die Antwort, sondern eine Problemumgehung für den Fall, dass diese Datei nicht "entsperrt" werden kann, ohne den IIS-Server neu zu starten:
Was passiert, wenn Sie einen neuen leeren Ordner erstellen / bereitstellen und das Ausgangsverzeichnis der Website in diesen Ordner ändern? Sie müssen jedoch einen neuen Ordnernamen erstellen oder zwischen zwei Namen wechseln.
Ich weiß nicht, in welchen Ordner diese Datei gehört. Wenn es sich nicht im Stammordner befinden muss, können Sie es in einem neu erstellten Ordner ablegen und ein virtuelles Verzeichnis erstellen, das auf diesen Ordner verweist. So können Sie Ihr Standard-Ausgangsverzeichnis für die Anwendung beibehalten.
quelle
Ich hatte das gleiche problem Jetzt bin ich zu MSDeploy (Web Deploy) gewechselt und kann die Website jetzt zuverlässig aktualisieren, ohne etwas zu stoppen. Tatsächlich ist dieser Schritt in unserem automatisierten Build-Tool skriptiert und läuft die ganze Zeit ohne Probleme ab. Und es ist auch schnell.
quelle
Stoppen Sie den IIS-Dienst. Vielleicht verstehe ich etwas nicht, sorry.
quelle
Hinweis: Kein Experte für Windows-Dateisperrsemantik
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 die aktuelle Datei umbenennen.
Wenn die Windows-Dateisperrsemantik ähnlich wie bei POSIX funktioniert, sollten die Leser, die eine aktuelle Lesesperre für die Datei haben, die alte Datei weiterhin bedienen, bis sie ihre Lesestreams schließen, während neue Leser die neue Datei öffnen.
quelle