Durante nuestras compilaciones de producción, IIS a veces bloquea un archivo de contenido estático muy grande (10 megabytes) en el directorio raíz y la tarea de limpieza no puede eliminarlo. Presumiblemente, esto se debe a que se atiende activamente a uno o más clientes en ese 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 IIS por completo; que no queremos hacer esto!
¿Hay alguna otra forma de hacer que IIS suelte un archivo bloqueado sin reiniciar IIS? Simplemente detener e iniciar el sitio web individual definitivamente no funciona para liberar el bloqueo de archivos.
Respuestas:
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 se 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 configurar un nuevo cuadro con el nuevo contenido y mover el nombre de dominio / IP para "promover" el nuevo contenido a producción.
fuente
Utilizo una pequeña herramienta llamada "Manejar" para hacer esto.
Básicamente le pasa el nombre del archivo que está bloqueado y le dice qué procesos lo están usando:
Luego le pasa el interruptor -c para que cierre el controlador:
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.
fuente
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 precompilan 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:
fuente
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
Este es IIS 6.0, pero dado que esto parece estar relacionado con el sistema operativo y no con IIS, podría ser la causa raíz.
fuente
Process Monitor debería ayudarlo con su investigación, aquí hay un ejemplo del blog de Mark ( el tipo que escribió la herramienta) sobre cómo encontrar el identificador de archivo.
Es posible que desee probar esta herramienta de desbloqueo para automatizar su desbloqueo a nivel de controlador de archivos.
fuente
No es la respuesta, pero es una idea alternativa en caso de que no haya forma de "desbloquear" ese archivo sin reiniciar el servidor IIS:
¿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.
fuente
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.
fuente
Claro, detenga el servicio IIS. Tal vez no entiendo algo, lo siento.
fuente
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.
fuente