it-swarm-pt.tech

Como fazer com que o IIS7 libere um arquivo bloqueado?

Durante nossas compilações de produção, um arquivo estático muito grande (10 megabytes) no diretório raiz às vezes é bloqueado por IIS e não pode ser excluído pela tarefa limpa. Isso é provavelmente porque está sendo atendido ativamente a um ou mais clientes no momento.

O processo de compilação interrompe o site antes de limpar via

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

No entanto, este não libera o arquivo - temos que reiniciar IIS para obter o processo para abandonar seu bloqueio.

appcmd.exe permite remover IIS para baixo completamente; nós não) queremos fazer isso!

Existem outras maneiras de obter IIS para liberar um arquivo bloqueado, sem reiniciar o IIS? Simplesmente parar e iniciar o site individual definitivamente não está funcionando para liberar o bloqueio de arquivo.

25
Jarrod Dixon

Existem ferramentas, como o Process Explorer da Sysinternal, que podem encontrar e fechar forçosamente os identificadores de arquivo, no entanto, o estado e o comportamento do aplicativo (tanto o seu quanto, neste caso, o IIS) depois de fazer isso são indefinidos. Alguns não se importam, alguns cometem erros e outros caem com força.

A solução correta é interromper a interrupção e permitir IIS para liberar bloqueios de maneira limpa e limpar depois de si mesma para preservar a estabilidade do servidor. Se isso não for possível, você poderá criar outro site na mesma caixa , ou configure uma nova caixa com o novo conteúdo e mova o nome do domínio/IP para "promover" o novo conteúdo para produção.

12
Greg Work

Eu uso uma pequena ferramenta chamada "Handle" para fazer isso.

Você basicamente passa o nome do arquivo bloqueado e informa quais processos estão sendo usados:

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

Em seguida, você passa a opção -c para fechar o identificador:

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

Você pode se esforçar para trabalhar isso em um script de construção sem um programa wrapper para analisar a saída, mas espero que isso ajude.

13
Simon Johnson

Não tenho certeza se você quer dizer a compilação de arquivos aspx em assemblies temporários. Estamos usando projetos de implantação do ASP.NET , que pré-compila todos os arquivos aspx/ascx antecipadamente.

Ao copiar os arquivos binários da pasta "publicar" para a pasta "bin", ativamos temporariamente um arquivo app_offline.htm que é removido após a cópia de todos os assemblies (apenas alguns segundos). Dessa forma, nunca experimentei bloqueios de arquivos.

EDIT:

Você pode tentar reciclar o pool de aplicativos usando appcmd.exe, em vez de parar o site:

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

Estou tentando isso agora: aparentemente, pode haver problemas com o bloqueio de arquivos se você tiver a indexação ativada no diretório. http://www.richard-banks.org/2008/04/how-to-fix-problems-with-locked-files.html

Isso é IIS 6.0, mas como isso parece estar relacionado ao sistema operacional e não IIS, pode ser a causa raiz.

2
Morten

Process Monitor deve ajudá-lo com sua investigação, aqui está m exemplo do blog de Mark ( o cara que escreveu a ferramenta) sobre como encontrar o identificador de arquivo.

Você pode tentar isso Ferramenta Unlocker para automatizar seu desbloqueio no nível do identificador de arquivo.

1
Nick Kavadias

Não é a resposta, mas uma idéia alternativa, caso não haja como "desbloquear" esse arquivo sem reiniciar IIS servidor:

E se você criar/implantar em uma nova pasta vazia e alterar o diretório inicial do site para essa pasta? Você precisa criar um novo nome de pasta ou alternar entre dois nomes.

Não sei em qual pasta esse arquivo pertence. Se não precisar estar na pasta raiz, você pode colocá-lo em uma pasta recém-criada e criar um diretório virtual apontando para essa pasta. Assim, você pode manter seu diretório inicial padrão para o aplicativo.

1
splattne

Eu tive o mesmo problema. Agora mudei para MSDeploy (Web Deploy) e agora posso atualizar o site de forma confiável sem parar nada. De fato, esta etapa é roteirizada em nossa ferramenta de criação automatizada e acontece o tempo todo sem problemas. E é rápido também.

1
realMarkusSchmidt

Claro, pare o serviço IIS. Talvez eu não esteja entendendo algo, desculpe.

0
Mark Allen

note: não é especialista em semântica de bloqueio de arquivos do Windows

Jarrod, você é capaz de renomear o arquivo fora do caminho. Você também pode criar seu novo arquivo com uma extensão temporária e renomeá-lo sobre o arquivo atual.

Se a semântica de bloqueio de arquivos do Windows funcionar de maneira semelhante às do POSIX, os leitores que mantêm um bloqueio de leitura atual no arquivo ainda devem continuar servindo o arquivo antigo até fechar seus fluxos de leitura, enquanto novos leitores abrirão o novo arquivo.

0
Dave Cheney