IIS7에서 잠긴 파일을 해제하는 방법?


25

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

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

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

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

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

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


1
지금 심각한 질문 :이 정적 파일은 빌드마다 변경됩니까, 아니면 절대 변경되지 않는 파일입니까?
splattne

미친 생각이지만이 폴더에서 쉐도우 복사본을 활성화하면 어떻게 될지 궁금합니다.
Richard West

이것이 sitemap.xml입니까?
Dave Cheney

예, sitemap.xml 이었지만 이제 MVC 라우트가 있고 메모리에 빨판을 캐시했습니다. 더 이상 잠그지 마십시오!
Jarrod Dixon

답변:


12

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

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


2
프로세스 탐색기의 경우 +1, 파일 핸들이 열려있는 스레드를 확인할 수있는 경우 문제를 해결할 수있는 통찰력을 줄 수 있습니다.
Nick Kavadias

Powershell , C # 또는 스크립트 bat-cmd 와 함께 Sysinternals 도구를 사용하여 프로그래밍 방식으로 잠금 파일을 해제하는 것이 매우 유용 할 수 있습니다.
Kiquenet

IIS에서 파일을 해당 IIS 제어 폴더로 복사 한 다음 브라우저에서 웹 응용 프로그램을 보려고하면 파일 또는 디렉토리의 잠금을 해제 할 수 있습니다. 때때로이 프로세스는 해당 핸들을 잠금 해제합니다.
Marc Noon

13

이를 위해 "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

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


강력한 마크 루시 노 비치 (Mark Russinovich)가 구조에 대해 자세히 살펴 보겠다. 그러나 강제로 핸들을 닫을 때 핸들이 프로그램 불안정에 대한 심각한 경고를하게되면 긴장이된다.
Jarrod Dixon

모든 불안정성이 문제의 AppPool로 제한되기를 바랍니다. 이 경우 잠금을 해제 한 후 AppPool을 다시 시작하면됩니다.
Simon Johnson

@ Jarrod : 행운이 있습니까? 원래 게시물에 결과를 게시 할 수 있습니까? 나는 뒤에서 무슨 일이 일어나고 있는지보고 싶습니다.
Pure.Krome

어쩌면 매우 유용 발표 잠긴 파일 을 프로그래밍 하여 핸들파워 쉘 , C 번호 또는 스크립트 박쥐-CMD폴더 잠금 프로세스를 얻을
Kiquenet

5

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

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

편집하다:

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

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

1
아니요, 루트 디렉토리에있는 정적 콘텐츠 파일 일뿐입니다. 해당 정보로 질문을 업데이트하십시오!
Jarrod Dixon

1
빌드 작업을 실행하는 동안 app_offline.htm을 사용하고 있다고 생각하십니까?
splattne

우리는 수동으로 재활용을 시도했지만 아무 소용이 없지만 다음에 잠금이있을 때 다시 시도 할 것입니다 (앱 풀은 .NET 용입니다. 아마 여기서 도움이되지 않을 것입니다). 우리는 app_offline.htm 파일을 만들었지 만 잠금에 도움이되지 않아 개별 사이트를 다운시키는 방법으로 이동했습니다.
Jarrod Dixon

네가 옳은 것 같아 나는 우리 서버 중 하나에서 이것을 테스트하고 당신에게 돌아올 것입니다.
splattne

1
@ splattne : 응용 프로그램 풀을 재활용하면 파일이 웹 사이트에서 열린 경우 핸들을 제거해야합니다. 풀을 재활용해도 도움이되지 않으면 다른 것이 파일을 잠급니다.
pbz


1

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

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


쿨, 나는 프로세스 모니터를 사용한 적이 없다; 그러나 내가 사용하는 모든 워크 스테이션은 즉시 Process Explorer를 얻습니다! technet.microsoft.com/ko-kr/sysinternals/bb896653.aspx
Jarrod Dixon

1

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

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

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


1

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


0

물론 IIS 서비스를 중지하십시오. 어쩌면 이해가 안 돼서 죄송합니다.


2
IIS 서비스를 중지하면 모든 웹 사이트가 중단됩니다.
splattne

CruiseControl.NET 사이트가 다운되는 것을 원하지 않기 때문에 우리가 정말로 피하고 싶은 것은 바로 성공입니다. 빌드 중에 madmen과 같은 "상태 새로 고침"버튼을 클릭하여 성공 여부를 확인하십시오!
Jarrod Dixon

좋아, 다른 곳을 먼저 구축하고 서버에서 모든 것을 수행하는 대신 정적 파일을 배포하는 것은 어떻습니까?
Mark Allen

여기서 문제가 아니십니까? 아무도 파일 자체가 서버 자체의 소프트웨어에 의해 수정되고 있다고 말하지 않았습니다.
FlavorScape

0

참고 : Windows 파일 잠금 의미론 전문가가 아닙니다.

Jarrod, 파일 이름을 바꿀 수 없습니까? 임시 확장명을 사용하여 새 파일을 만든 다음 현재 파일의 이름을 바꿀 수도 있습니다.

Windows 파일 잠금 시맨틱이 POSIX와 유사하게 작동하는 경우 파일에서 현재 읽기 잠금을 보유한 판독기는 여전히 읽기 스트림을 닫을 때까지 이전 파일을 계속 제공해야하며 새 판독기는 새 파일을 엽니 다.


아니요, IIS를 다시 시작할 때까지 파일에 대한 작업을 수행 할 수 없습니다.
Jarrod Dixon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.