IIS7에서 잠긴 파일을 해제하는 방법? 빌드 중에 루트 디렉토리에있는 매우 큰

프로덕션 빌드 중에 루트 디렉토리에있는 매우 큰 (10MB) 정적 컨텐츠 파일은 IIS에 의해 잠기 며 정리 작업으로 삭제할 수 없습니다. 아마도 한 번에 하나 이상의 클라이언트에게 적극적으로 제공되고 있기 때문일 수 있습니다.

빌드 프로세스는 다음을 통해 청소하기 전에 웹 사이트를 중지합니다

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

그러나 파일 이 해제 되지는 않습니다 . 프로세스가 잠금을 해제하려면 IIS를 다시 시작해야합니다.

appcmd.exeIIS를 완전히 중단시킬 수 있습니다. 우리 는 이것을 하고 싶지 않습니다 !

IIS를 다시 시작하지 않고 IIS가 잠긴 파일을 보내도록하는 다른 방법이 있습니까? 개별 웹 사이트를 중지하고 시작하는 것만으로는 파일 잠금을 해제 할 수 없습니다.



답변

Sysinternal의 Process Explorer와 같은 파일 핸들을 찾아서 강제로 닫을 수있는 도구가 있지만이를 수행 한 후 애플리케이션 (이 경우 IIS)의 상태 및 동작은 정의되지 않습니다. 일부는 신경 쓰지 않고 일부는 오류가 있고 다른 일부는 열심히 충돌합니다.

올바른 해결책은 서버 중단을 방지하고 IIS가 잠금을 완전히 해제하고 자체적으로 정리하여 서버 안정성을 유지하는 것입니다. 이것이 불가능한 경우 동일한 상자에 다른 사이트를 만들거나 새 내용으로 새 상자를 설정하고 도메인 이름 / IP를 이동하여 새 내용을 프로덕션으로 “승격”할 수 있습니다.


답변

이를 위해 “Handle” 이라는 작은 도구를 사용합니다 .

기본적으로 잠겨있는 파일의 이름을 전달하고 사용중인 프로세스를 알려줍니다.

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

그런 다음 -c 스위치를 전달하여 핸들을 닫습니다.

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

랩퍼 프로그램없이 빌드 스크립트에서 출력을 구문 분석하기 위해 노력하는 것이 어려울 수 있지만 희망이 있으면 도움이 될 것입니다.


답변

임시 어셈블리에서 aspx 파일의 컴파일을 의미하는지 확실하지 않습니다. 우리는 모든 aspx / ascx 파일을 미리 미리 컴파일 하는 ASP.NET 배포 프로젝트를 사용하고 있습니다.

바이너리 파일을 “publish”에서 “bin”폴더로 복사하는 동안 모든 어셈블리가 복사 된 후 (몇 초) app_offline.htm 파일을 임시로 활성화합니다. 이렇게하면 파일 잠금이 발생하지 않았습니다.

편집하다:

웹 사이트를 중지하는 대신 appcmd.exe를 사용하여 앱 풀을 재활용하려고 시도 할 수 있습니다.

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

답변

나는 이것을 지금 시도하고있다 : 디렉토리에서 색인을 활성화하면 파일 잠금에 문제가있을 수 있습니다.
http://www.richard-banks.org/2008/04/how-to-fix-problems-with-locked-files.html

이것은 IIS 6.0이지만 IIS가 아닌 OS와 관련이있는 것 같아 근본 원인 일 수 있습니다.


답변

모니터 프로세스 수사에 도움한다, 여기에 예를 들어 마크의 블로그 (에서 파일 핸들을 찾는 방법에 대한 도구를 쓴 사람).

이 잠금 해제 도구 를 사용하여 파일 핸들 수준에서 잠금 해제를 자동화 할 수 있습니다.


답변

대답은 아니지만 IIS 서버를 다시 시작하지 않고 해당 파일을 “잠금 해제”할 수없는 경우의 해결 방법입니다.

비어있는 새 폴더를 빌드 / 배포하고 웹 사이트의 홈 디렉토리를 해당 폴더로 변경하면 어떻게됩니까? 그래도 새 폴더 이름을 작성하거나 두 이름 사이를 전환해야합니다.

해당 파일이 어떤 폴더에 속하는지 모르겠습니다. 루트 폴더에 있지 않아도된다면 새로 만든 폴더에 넣고 해당 폴더를 가리키는 가상 디렉터리를 만들 수 있습니다. 따라서 응용 프로그램의 표준 홈 디렉토리를 유지할 수 있습니다.


답변

나는 같은 문제가 있었다. 이제 MSDeploy (Web Deploy) 로 전환했으며 아무 것도 중지하지 않고 웹 사이트를 안정적으로 업데이트 할 수 있습니다. 실제로이 단계는 자동화 된 빌드 도구에서 스크립팅되며 문제없이 항상 발생합니다. 그리고 그것은 또한 빠릅니다.