Come ottenere IIS7 per rilasciare un file bloccato?


25

Durante le build di produzione, un file di contenuto statico molto grande (10 megabyte) nella directory principale verrà talvolta bloccato da IIS e non può essere eliminato dall'attività clean. Questo è presumibilmente perché viene servito attivamente a uno o più clienti in quel momento.

Il processo di compilazione interrompe il sito Web prima della pulizia tramite

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

Tuttavia, questo non rilascia il file: dobbiamo riavviare IIS per far sì che il processo rinunci al blocco.

appcmd.execonsente di eliminare completamente IIS; noi non vogliamo fare questo!

Esistono altri modi per consentire a IIS di rilasciare un file bloccato, senza riavviare IIS? Semplicemente arrestare e avviare il singolo sito Web non funziona sicuramente per rilasciare il blocco dei file.


1
Domanda seria ora: questo file statico cambia da build a build o è solo un file che non cambierà mai?
splattne,

Solo un pensiero folle, ma mi chiedo cosa succederebbe se abilitassi le copie shadow su questa cartella?
Richard West,

Questo è il tuo sitemap.xml giusto?
Dave Cheney,

Sì, era il nostro sitemap.xml, ma ora abbiamo solo un percorso MVC per esso e memorizziamo nella cache il pollone. Niente più bloccaggio!
Jarrod Dixon

Risposte:


12

Esistono strumenti, come Process Explorer di Sysinternal, che possono trovare e chiudere forzatamente gli handle di file, tuttavia lo stato e il comportamento dell'applicazione (sia i tuoi che, in questo caso, IIS) dopo aver fatto ciò non sono definiti. Alcuni non si preoccuperanno, altri si guasteranno e altri andranno in crash.

La soluzione corretta è quella di interrompere l'interruzione e consentire a IIS di rilasciare i blocchi in modo pulito e ripulire dopo se stesso per preservare la stabilità del server. Se ciò non è possibile, è possibile creare un altro sito nella stessa casella o impostare una nuova casella con il nuovo contenuto e spostare il nome di dominio / IP su "promuovere" il nuovo contenuto in produzione.


2
+1 per Process Explorer, potrebbe darti un'idea di come risolvere il problema se riesci a vedere quale thread tiene aperto l'handle del file
Nick Kavadias,

Forse molto utile rilasciato file bloccato a livello di codice utilizzando Sysinternals attrezzi con PowerShell , C # o script bat-cmd
Kiquenet

Ho IIS per sbloccare il file o la directory semplicemente provando a copiare i file in quella cartella controllata da IIS e quindi visualizzando l'app Web in un browser. A volte questo processo sblocca questi handle.
Marc Noon,

13

Per fare questo uso un piccolo strumento chiamato "Gestisci" .

Fondamentalmente gli passi il nome del file che è bloccato e ti dice quali processi lo stanno usando:

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

Quindi si passa l'interruttore -c per farlo chiudere la maniglia:

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

Potresti avere difficoltà a lavorare su uno script di compilazione senza un programma wrapper per analizzare l'output, ma speriamo che questo possa aiutare.


Il potente Mark Russinovich in soccorso: lo verificherò, ma il terribile avvertimento di Handle sull'instabilità del programma quando si chiude forzatamente una maniglia mi rende nervoso.
Jarrod Dixon

Eventualmente qualsiasi instabilità sarà limitata all'AppPool in questione. In tal caso, puoi semplicemente riavviare AppPool dopo aver rilasciato il blocco.
Simon Johnson,

@ Jarrod: qualche fortuna? Potresti pubblicare qualche risultato, fino al tuo post originale, per favore? mi piacerebbe vedere cosa sta succedendo qui, dietro le quinte.
Pure.Krome,

Forse molto utile rilasciato file bloccato a livello di codice utilizzando la maniglia con PowerShell , C # o script bat-cmd e ottenere i processi che bloccano una cartella
Kiquenet

5

Non sono sicuro se intendi la compilazione di file aspx in assembly temporanei. Stiamo utilizzando progetti di distribuzione ASP.NET , che precompilano preventivamente tutti i file aspx / ascx.

Durante la copia dei file binari dalla cartella "pubblica" nella cartella "bin", abilitiamo temporaneamente un file app_offline.htm che viene rimosso dopo che tutti gli assembly sono stati copiati (solo pochi secondi). In questo modo non ho mai avuto blocchi di file.

MODIFICARE:

Potresti provare a riciclare il pool di app utilizzando appcmd.exe, invece di interrompere il sito Web:

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

1
No, è solo un file di contenuto statico nella directory principale: aggiorna la domanda con quelle informazioni!
Jarrod Dixon

1
Immagino che stai usando app_offline.htm durante l'exection del tuo lavoro di compilazione?
splattne,

Penso che abbiamo provato a riciclare manualmente senza successo, ma lo proveremo di nuovo la prossima volta che c'è un blocco (i pool di app sono per .NET, giusto? Probabilmente non aiuterà qui). E prima creavamo il file app_offline.htm, ma non ci ha aiutato con il blocco, motivo per cui siamo passati a rimuovere il singolo sito.
Jarrod Dixon

Ho paura che tu abbia ragione. Lo testerò su uno dei nostri server e tornerò da te.
splattne,

1
@splattne: il riciclaggio del pool di applicazioni avrebbe dovuto rimuovere l'handle a condizione che il file fosse stato aperto dal sito Web. Se il riciclo del pool non aiuta, suppongo che qualcos'altro blocchi il file.
pbz,



1

Non la risposta, ma un'idea alternativa nel caso in cui non sia possibile "sbloccare" quel file senza riavviare il server IIS:

Cosa succede se si crea / distribuisce in una nuova cartella vuota e si modifica la home directory del sito Web in quella cartella? Devi creare un nuovo nome di cartella o passare da un nome all'altro.

Non so in quale cartella appartiene quel file. Se non è necessario che si trovi nella cartella principale, è possibile inserirlo in una cartella appena creata e creare una directory virtuale che punta a quella cartella. Quindi puoi mantenere la tua home directory standard per l'applicazione.


1

Ho avuto lo stesso problema. Ora sono passato a MSDeploy (Web Deploy) e ora posso aggiornare il sito Web in modo affidabile senza interrompere nulla. In realtà questo passaggio è scritto nel nostro strumento di compilazione automatizzato e succede continuamente senza problemi. Ed è anche veloce.


0

Certo, ferma il servizio IIS. Forse non capisco qualcosa, scusa.


2
Se interrompi il servizio IIS, eliminerai tutti i siti Web ...
splattne,

Questa è l'unica cosa che vogliamo davvero evitare, poiché non vogliamo che il nostro sito CruiseControl.NET venga interrotto: facciamo clic sul pulsante "Aggiorna stato" come pazzi durante una build per verificare il successo!
Jarrod Dixon

Ok, che ne dici di costruire prima da qualche altra parte, quindi distribuire sul file statico invece di fare tutto su quel server?
Mark Allen,

non è questo il problema qui? Nessuno ha detto che il file veniva modificato dal software sul server stesso.
FlavorScape

0

nota: non un esperto di semantica di blocco dei file di Windows

Jarrod, sei in grado di rinominare il file di mezzo. Potresti anche essere in grado di creare il tuo nuovo file con un'estensione temporanea e quindi rinominarlo sul file corrente.

Se la semantica del blocco dei file di Windows funziona in modo simile a quelli di POSIX, i lettori che dispongono di un blocco di lettura corrente sul file devono continuare a servire il vecchio file fino a quando non chiudono i flussi di lettura, mentre i nuovi lettori apriranno il nuovo file.


No, non siamo in grado di fare nulla per il file fino al riavvio di IIS.
Jarrod Dixon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.