Comment obtenir IIS7 pour libérer un fichier verrouillé?

25

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.exevous 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.

Jarrod Dixon
la source
1
Question sérieuse maintenant: ce fichier statique change-t-il de build en build ou est-ce juste un fichier qui ne changera jamais?
splattne
Juste une pensée folle, mais je me demande ce qui se passerait si vous activiez les clichés instantanés sur ce dossier?
Richard West
C'est votre droit sitemap.xml?
Dave Cheney
Ouais, c'était notre sitemap.xml, mais maintenant nous avons juste un itinéraire MVC vers lui et cache le ventouse en mémoire. Plus de verrouillage!
Jarrod Dixon

Réponses:

12

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.

Greg Work
la source
2
+1 pour l'explorateur de processus, cela peut vous donner un aperçu de la possibilité de résoudre le problème si vous pouvez voir quel thread maintient le
descripteur de
Peut-être un fichier verrouillé publié très utile par programme à l' aide des outils Sysinternals avec Powershell , C # ou des scripts bat-cmd
Kiquenet
J'ai IIS pour déverrouiller le fichier ou le répertoire simplement en essayant de copier des fichiers dans ce dossier contrôlé par IIS, puis en affichant l'application Web dans un navigateur. Parfois, ce processus déverrouille ces poignées.
Marc Noon
13

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:

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

Ensuite, vous lui passez le commutateur -c pour le faire fermer la poignée:

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

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.

Simon Johnson
la source
Le puissant Mark Russinovich à la rescousse - je vais vérifier cela, mais le terrible avertissement de Handle de l'instabilité du programme lors de la fermeture forcée d'une poignée me rend nerveux.
Jarrod Dixon
Espérons que toute instabilité sera limitée à l'AppPool en question. Si tel est le cas, vous pouvez simplement redémarrer l'AppPool après avoir libéré le verrou.
Simon Johnson,
@ Jarrod: pas de chance? Pourriez-vous publier des résultats dans votre message d'origine, s'il vous plaît? j'aimerais voir ce qui se passe ici, dans les coulisses.
Pure.Krome
Peut-être un fichier verrouillé publié très utile par programmation en utilisant Handle avec Powershell , C # ou des scripts bat-cmd et obtenez des processus qui verrouillent un dossier
Kiquenet
5

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:

C:\Windows\System32\inetsrv\appcmd.exe recycle apppool "My App Pool Name"
splattne
la source
1
Non, c'est juste un fichier de contenu statique dans le répertoire racine - mettant à jour la question avec cette information!
Jarrod Dixon
1
Je suppose que vous utilisez app_offline.htm pendant l'exection de votre travail de build?
splattne
Je pense que nous avons essayé le recyclage manuellement en vain, mais nous essaierons à nouveau la prochaine fois qu'il y aura un verrou (les pools d'applications sont pour .NET, non? Ça n'aidera probablement pas ici). Et nous avions l'habitude de créer le fichier app_offline.htm, mais cela n'a pas aidé avec le verrouillage - c'est pourquoi nous sommes passés à la suppression du site individuel.
Jarrod Dixon
J'ai bien peur que tu aies raison. Je vais tester cela sur l'un de nos serveurs et je reviendrai vers vous.
splattne
1
@splattne: le recyclage du pool d'applications aurait dû supprimer le handle à condition que le fichier ait été ouvert par le site Web. Si le recyclage de la piscine n'aide pas, je suppose que quelque chose d'autre verrouille le fichier.
pbz
1

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.

Nick Kavadias
la source
Cool, je n'ai jamais utilisé Process Monitor; mais chaque poste de travail que j'utilise reçoit immédiatement Process Explorer! technet.microsoft.com/en-us/sysinternals/bb896653.aspx
Jarrod Dixon
1

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.

splattne
la source
1

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.

realMarkusSchmidt
la source
0

Bien sûr, arrêtez le service IIS. Peut-être que je ne comprends pas quelque chose, désolé.

Mark Allen
la source
2
Si vous
arrêtez
C'est la seule chose que nous voulons vraiment éviter, car nous ne voulons pas que notre site CruiseControl.NET tombe en panne - nous cliquons sur ce bouton "Actualiser l'état" comme des fous pendant une construction pour vérifier le succès!
Jarrod Dixon
Ok, que diriez-vous de construire ailleurs d'abord, puis de déployer sur le fichier statique au lieu de tout faire sur ce serveur?
Mark Allen,
n'est-ce pas là le problème? Personne n'a dit que le fichier était modifié par un logiciel sur le serveur lui-même.
FlavorScape
0

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.

Dave Cheney
la source
Non, nous ne pouvons rien faire au fichier tant que IIS n'est pas redémarré.
Jarrod Dixon