Durante nossas compilações de produção, um arquivo estático muito grande (10 megabytes) no diretório raiz às vezes é bloqueado pelo IIS e não pode ser excluído pela tarefa limpa. Provavelmente, isso 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, isso não libera o arquivo - precisamos reiniciar o IIS para que o processo abandone seu bloqueio.
appcmd.exe
permite derrubar o IIS completamente; nós não queremos fazer isso!
Existem outras maneiras de obter o 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 do arquivo.
Respostas:
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 que o IIS libere bloqueios de forma limpa e faça a limpeza após si próprio para preservar a estabilidade do servidor. Se isso não for possível, você pode criar outro site na mesma caixa ou configurar uma nova caixa com o novo conteúdo e mover o nome do domínio / IP para "promover" o novo conteúdo para produção.
fonte
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:
Em seguida, você passa a opção -c para fechar o identificador:
Você pode se esforçar para trabalhar isso em um script de construção sem um programa de wrapper para analisar a saída, mas espero que isso ajude.
fonte
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é-compilam 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.
EDITAR:
Você pode tentar reciclar o pool de aplicativos usando appcmd.exe, em vez de parar o site:
fonte
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
Este é o IIS 6.0, mas como parece estar relacionado ao sistema operacional e não ao IIS, pode ser a causa raiz.
fonte
O Process Monitor deve ajudá-lo com sua investigação. Aqui está um exemplo do blog de Mark ( o cara que escreveu a ferramenta) sobre como encontrar o identificador de arquivo.
Você pode tentar esta ferramenta Unlocker para automatizar seu desbloqueio no nível do identificador de arquivo.
fonte
Não é a resposta, mas uma idéia alternativa, caso não haja como "desbloquear" esse arquivo sem reiniciar o servidor IIS:
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ê poderá 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.
fonte
Eu tive o mesmo problema. Agora mudei para o MSDeploy (Web Deploy) e agora posso atualizar o site de maneira confiável sem parar nada. De fato, esta etapa está em script em nossa ferramenta de criação automatizada e acontece o tempo todo sem problemas. E é rápido também.
fonte
Claro, pare o serviço IIS. Talvez eu não esteja entendendo alguma coisa, desculpe.
fonte
Nota: 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 à 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.
fonte