Lors de nos builds de production, un très gros fichier de contenu statique (10 mégaoctets) dans le répertoire racine est parfois verrouillé par IIS et ne peut pas être supprimé par la tâche de nettoyage. Cela est probablement dû au fait qu'il est activement servi à un ou plusieurs clients à l'époque.
Le processus de construction arrête le site Web avant de le nettoyer via
c:\Windows\System32\inetsrv\appcmd.exe stop site http://oursite.com
Cependant, cela ne libère pas le fichier - nous devons redémarrer IIS pour que le processus abandonne son verrou.
appcmd.exe
vous permet de supprimer complètement IIS; nous ne voulons pas faire ça!
Existe-t-il d'autres moyens pour que IIS abandonne un fichier verrouillé sans redémarrer IIS? Arrêter et démarrer simplement le site Web individuel ne fonctionne certainement pas pour libérer le verrou de fichier.
Réponses:
Il existe des outils, tels que l'Explorateur de processus de Sysinternal, qui peuvent trouver et fermer de force les descripteurs de fichiers, mais l'état et le comportement de l'application (à la fois la vôtre et, dans ce cas, IIS) après cela, n'est pas défini. Certains s'en foutent, certains commettront des erreurs et d'autres planteront brutalement.
La solution correcte consiste à prendre la panne et à permettre à IIS de libérer proprement les verrous et de nettoyer après lui-même pour préserver la stabilité du serveur. Si cela n'est pas possible, vous pouvez soit créer un autre site sur la même boîte, soit configurer une nouvelle boîte avec le nouveau contenu et déplacer le nom de domaine / IP pour «promouvoir» le nouveau contenu en production.
la source
J'utilise un petit outil appelé "Handle" pour ce faire.
Vous lui passez essentiellement le nom du fichier verrouillé et il vous indique quels processus l'utilisent:
Ensuite, vous lui passez le commutateur -c pour le faire fermer la poignée:
Vous pourriez avoir du mal à travailler cela dans un script de construction sans programme wrapper pour analyser la sortie, mais j'espère que cela vous aidera.
la source
Je ne sais pas si vous voulez dire la compilation de fichiers aspx dans des assemblages temporaires. Nous utilisons des projets de déploiement ASP.NET , qui précompilent tous les fichiers aspx / ascx au préalable.
Lors de la copie des fichiers binaires du dossier «publier» vers le dossier «bin», nous activons temporairement un fichier app_offline.htm qui est supprimé après la copie de tous les assemblys (quelques secondes seulement). De cette façon, je n'ai jamais connu de verrous de fichiers.
MODIFIER:
Vous pouvez essayer de recycler le pool d'applications à l'aide de appcmd.exe, au lieu d'arrêter le site Web:
la source
J'essaie maintenant: Apparemment, il pourrait y avoir des problèmes avec le verrouillage de fichiers si l'indexation est activée sur le répertoire. http://www.richard-banks.org/2008/04/how-to-fix-problems-with-locked-files.html
Il s'agit d'IIS 6.0, mais comme cela semble être lié au système d'exploitation et non à IIS, cela pourrait être la cause première.
la source
Process Monitor devrait vous aider dans votre enquête, voici un exemple tiré du blog de Mark ( le gars qui a écrit l'outil) sur la façon de trouver le descripteur de fichier.
Vous voudrez peut-être essayer cet outil Unlocker pour automatiser votre déverrouillage au niveau du descripteur de fichier.
la source
Pas la réponse, mais une idée de contournement au cas où il n'y aurait aucun moyen de "déverrouiller" ce fichier sans redémarrer le serveur IIS:
Que se passe-t-il si vous créez / déployez dans un nouveau dossier vide et modifiez le répertoire de base du site Web dans ce dossier? Vous devez cependant créer un nouveau nom de dossier ou basculer entre deux noms.
Je ne sais pas à quel dossier appartient ce fichier. S'il ne doit pas être dans le dossier racine, vous pouvez le placer dans un dossier nouvellement créé et créer un répertoire virtuel pointant vers ce dossier. Vous pouvez donc conserver votre répertoire personnel standard pour l'application.
la source
J'ai eu le même problème. Maintenant, je suis passé à MSDeploy (Web Deploy) , et maintenant je peux mettre à jour le site Web de manière fiable sans rien arrêter. En fait, cette étape est scriptée dans notre outil de construction automatisé et elle se produit tout le temps sans aucun problème. Et c'est rapide aussi.
la source
Bien sûr, arrêtez le service IIS. Peut-être que je ne comprends pas quelque chose, désolé.
la source
note: pas un expert en sémantique de verrouillage de fichiers Windows
Jarrod, pouvez-vous renommer le fichier à l'écart. Vous pouvez également créer votre nouveau fichier avec une extension temporaire, puis le renommer sur le fichier actuel.
Si la sémantique de verrouillage des fichiers Windows fonctionne de manière similaire à celles de POSIX, les lecteurs qui détiennent un verrou de lecture actuel sur le fichier doivent continuer à servir l'ancien fichier jusqu'à ce qu'ils ferment leurs flux de lecture, tandis que les nouveaux lecteurs ouvriront le nouveau fichier.
la source