it-swarm-es.com

¿Cómo hacer que IIS7 libere un archivo bloqueado?

Durante nuestras compilaciones de producción, un archivo de contenido estático muy grande (10 megabytes) en el directorio raíz a veces estará bloqueado por IIS) y no puede ser eliminado por la tarea de limpieza. Esto es presumiblemente porque está siendo servido activamente a uno o más clientes en el momento.

El proceso de compilación detiene el sitio web antes de limpiarlo a través de

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

Sin embargo, esto no libera el archivo - tenemos que reiniciar IIS para que el proceso renuncie a su bloqueo.

appcmd.exe le permite eliminar por completo IIS por completo; nosotros no ¡queremos hacer esto!

¿Hay alguna otra forma de obtener IIS para soltar un archivo bloqueado, sin reiniciar IIS? Simplemente detener e iniciar el sitio web individual definitivamente no funciona para liberar el bloqueo de archivo.

25
Jarrod Dixon

Existen herramientas, como el Explorador de procesos de Sysinternal, que pueden encontrar y cerrar por la fuerza los identificadores de archivos, sin embargo, el estado y el comportamiento de la aplicación (tanto la suya como, en este caso, IIS) después de hacerlo no está definida. A algunos no les importará, algunos se equivocarán y otros se estrellarán con fuerza.

La solución correcta es tomar la interrupción y permitir que IIS) libere los bloqueos y limpie después de sí mismo para preservar la estabilidad del servidor. Si esto no es posible, puede crear otro sitio en el mismo cuadro o configure un nuevo cuadro con el nuevo contenido y mueva el nombre de dominio/IP para "promover" el nuevo contenido a producción.

12
Greg Work

Utilizo una pequeña herramienta llamada "Handle" para hacer esto.

Básicamente, le pasa el nombre del archivo que está bloqueado y le dice qué procesos lo están usando:

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

Luego, pasa el interruptor -c para que cierre el controlador:

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

Es posible que tenga dificultades para trabajar en un script de compilación sin un programa contenedor para analizar la salida, pero espero que esto ayude.

13
Simon Johnson

No estoy seguro de si te refieres a la compilación de archivos aspx en ensamblajes temporales. Estamos utilizando proyectos de implementación de ASP.NET , que precompila todos los archivos aspx/ascx de antemano.

Al copiar los archivos binarios de la "publicación" a la carpeta "bin", habilitamos temporalmente un archivo app_offline.htm que se elimina después de que se copian todos los ensamblajes (solo unos segundos). De esta manera nunca experimenté bloqueos de archivos.

EDITAR:

Puede intentar reciclar el grupo de aplicaciones usando appcmd.exe, en lugar de detener el sitio web:

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

Estoy probando esto ahora: aparentemente podría haber problemas con el bloqueo de archivos si tienes activada la indexación en el directorio. http://www.richard-banks.org/2008/04/how-to-fix-problems-with-locked-files.html

Esto es IIS 6.0 pero dado que esto parece estar relacionado con el sistema operativo y no IIS) podría ser la causa raíz.

2
Morten

Process Monitor debería ayudarte con tu investigación, aquí tienes n ejemplo del blog de Mark ( el chico que escribió la herramienta) sobre cómo encontrar el identificador de archivo.

Es posible que desee probar esto herramienta Unlocker para automatizar su desbloqueo a nivel de identificador de archivo.

1
Nick Kavadias

No es la respuesta, pero es una idea alternativa en caso de que no haya forma de "desbloquear" ese archivo sin reiniciar IIS servidor:

¿Qué sucede si crea/implementa en una nueva carpeta vacía y cambia el directorio de inicio del sitio web a esa carpeta? Sin embargo, debe crear un nuevo nombre de carpeta o cambiar entre dos nombres.

No sé a qué carpeta pertenece ese archivo. Si no tiene que estar en la carpeta raíz, puede colocarlo en una carpeta recién creada y crear un directorio virtual que apunte a esa carpeta. Para que pueda mantener su directorio de inicio estándar para la aplicación.

1
splattne

Yo tuve el mismo problema. Ahora cambié a MSDeploy (Web Deploy), y ahora puedo actualizar el sitio web de manera confiable sin detener nada. De hecho, este paso está programado en nuestra herramienta de compilación automatizada y ocurre todo el tiempo sin ningún problema. Y también es rápido.

1
realMarkusSchmidt

Claro, detenga el servicio IIS. Tal vez no entiendo algo, lo siento.

0
Mark Allen

nota: no es un experto en semántica de bloqueo de archivos de Windows

Jarrod, ¿puedes cambiar el nombre del archivo? También puede crear su nuevo archivo con una extensión temporal y luego renombrarlo sobre el archivo actual.

Si la semántica de bloqueo de archivos de Windows funciona de manera similar a POSIX, los lectores que mantienen un bloqueo de lectura actual en el archivo, aún deben continuar sirviendo el archivo antiguo hasta que cierren sus secuencias de lectura, mientras que los nuevos lectores abrirán el nuevo archivo.

0
Dave Cheney