Làm cách nào để IIS7 phát hành tệp bị khóa?


25

Trong quá trình sản xuất của chúng tôi, một tệp nội dung tĩnh rất lớn (10 megabyte) trong thư mục gốc đôi khi sẽ bị IIS khóa và không thể bị xóa bởi tác vụ sạch. Điều này có lẽ là vì nó đang được phục vụ tích cực cho một hoặc nhiều khách hàng tại thời điểm đó.

Quá trình xây dựng dừng trang web trước khi làm sạch thông qua

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

Tuy nhiên, điều này không giải phóng tệp - chúng tôi phải khởi động lại IIS để có được quy trình từ bỏ khóa của nó.

appcmd.execho phép bạn gỡ IIS xuống hoàn toàn; chúng tôi không muốn làm điều này!

Có cách nào khác để IIS thoát khỏi một tệp bị khóa mà không cần khởi động lại IIS không? Đơn giản chỉ cần dừng và bắt đầu trang web cá nhân chắc chắn không hoạt động để phát hành khóa tập tin.


1
Câu hỏi nghiêm túc bây giờ: liệu tệp tĩnh này thay đổi từ bản dựng sang bản dựng hay nó chỉ là một tệp sẽ không bao giờ thay đổi?
splattne

Chỉ là một suy nghĩ điên rồ, nhưng tôi tự hỏi điều gì sẽ xảy ra nếu bạn kích hoạt Shadow Copies trên thư mục này?
Richard West

Đây là sitemap.xml của bạn phải không?
Dave Cheney

Vâng, đó là sitemap.xml của chúng tôi, nhưng bây giờ chúng tôi chỉ có một tuyến đường MVC đến nó và lưu trữ bộ đệm trong bộ nhớ. Không khóa nữa!
Jarrod Dixon

Câu trả lời:


12

Có các công cụ, chẳng hạn như Process Explorer của Sysiternal, có thể tìm và buộc đóng các tệp xử lý, tuy nhiên trạng thái và hành vi của ứng dụng (cả của bạn và, trong trường hợp này, IIS) sau khi thực hiện việc này không được xác định. Một số sẽ không quan tâm, một số sẽ lỗi và những người khác sẽ gặp khó khăn.

Giải pháp chính xác là ngừng hoạt động và cho phép IIS giải phóng các khóa và dọn sạch sau đó để bảo vệ sự ổn định của máy chủ. Nếu điều này là không thể, bạn có thể tạo một trang web khác trên cùng một hộp hoặc thiết lập một hộp mới với nội dung mới và chuyển tên miền / IP qua để "quảng bá" nội dung mới vào sản xuất.


2
+1 cho trình thám hiểm quy trình, nó có thể cung cấp cho bạn một cái nhìn sâu sắc về khả năng giải quyết vấn đề nếu bạn có thể thấy chủ đề nào đang giữ tệp xử lý mở
Nick Kavadias

Có thể rất hữu ích được phát hành tệp bị khóa theo chương trình bằng cách sử dụng các công cụ
Sysiternals

Tôi đã có IIS để mở khóa tệp hoặc thư mục chỉ bằng cách cố gắng sao chép tệp vào thư mục do IIS kiểm soát đó và sau đó xem ứng dụng web trong trình duyệt. Đôi khi quá trình này mở khóa các tay cầm.
Marc trưa

13

Tôi sử dụng một công cụ nhỏ gọi là "Xử lý" để làm việc này.

Về cơ bản, bạn chuyển cho nó tên của tệp bị khóa và nó cho bạn biết các quy trình đang sử dụng nó:

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

Sau đó, bạn chuyển cho nó công tắc -c để làm cho nó đóng tay cầm:

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

Bạn có thể đấu tranh để làm việc với một tập lệnh xây dựng mà không có chương trình trình bao bọc để phân tích đầu ra nhưng hy vọng điều này sẽ giúp ích.


Mark Russinovich hùng mạnh đến giải cứu - Tôi sẽ kiểm tra điều này, nhưng cảnh báo nghiêm trọng của Xử lý về sự mất ổn định của chương trình khi buộc phải đóng một tay cầm khiến tôi lo lắng.
Jarrod Dixon

Hy vọng rằng bất kỳ sự mất ổn định nào sẽ được giới hạn trong AppPool. Nếu đó là trường hợp, thì bạn chỉ có thể thực hiện khởi động lại AppPool sau khi bạn đã phát hành khóa.
Simon Johnson

@ Jarrod: may mắn nào? Bạn có thể gửi bất kỳ kết quả, vào bài viết gốc của bạn, xin vui lòng? Tôi rất muốn xem những gì đang xảy ra ở đây, đằng sau hậu trường.
Pure.Krom

Có thể rất hữu ích đã phát hành tệp bị khóa theo chương trình bằng cách sử dụng Xử lý với Powershell , C # hoặc tập lệnh bat-cmdnhận các quy trình khóa thư mục
Kiquenet

5

Tôi không chắc nếu bạn muốn biên dịch các tệp aspx trong các cụm tạm thời. Chúng tôi đang sử dụng các dự án triển khai ASP.NET , tiền biên dịch trước tất cả các tệp aspx / ascx.

Trong khi sao chép các tệp nhị phân từ thư mục "xuất bản" sang thư mục "bin", chúng tôi tạm thời kích hoạt tệp app_offline.htm bị xóa sau khi tất cả các cụm được sao chép (chỉ vài giây). Bằng cách này, tôi không bao giờ có kinh nghiệm khóa tập tin.

CHỈNH SỬA:

Bạn có thể thử tái chế nhóm ứng dụng bằng appcmd.exe, thay vì dừng trang web:

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

1
Không, đó chỉ là một tệp nội dung tĩnh trong thư mục gốc - cập nhật câu hỏi với thông tin đó!
Jarrod Dixon

1
Tôi đoán bạn đang sử dụng app_offline.htm trong quá trình thực hiện công việc xây dựng của bạn?
splattne

Tôi nghĩ rằng chúng tôi đã thử tái chế thủ công nhưng không có kết quả, nhưng chúng tôi sẽ thử lại lần sau khi có khóa (nhóm ứng dụng dành cho .NET, phải không? Có lẽ sẽ không giúp được gì ở đây). Và chúng tôi đã từng tạo tệp app_offline.htm, nhưng nó không giúp ích gì cho việc khóa - đó là lý do tại sao chúng tôi chuyển sang gỡ trang web cá nhân xuống.
Jarrod Dixon

Tôi sợ bạn đúng. Tôi sẽ kiểm tra điều này trên một trong các máy chủ của chúng tôi và quay lại với bạn.
splattne

1
@splattne: Tái chế nhóm ứng dụng nên đã gỡ bỏ phần xử lý với điều kiện tệp được mở bởi trang web. Nếu việc tái chế pool không giúp ích gì thì tôi đoán là có thứ gì đó sẽ khóa tập tin.
pbz


1

Xử lý Monitor sẽ giúp bạn với điều tra của bạn, sau đây là một ví dụ từ blog của Mark ( các anh chàng đó đã viết công cụ) về cách tìm các tập tin xử lý.

Bạn có thể muốn thử công cụ Unlocker này để tự động mở khóa ở cấp độ xử lý tệp.


Thật tuyệt, tôi chưa bao giờ sử dụng Trình theo dõi tiến trình; nhưng mọi máy trạm tôi sử dụng ngay lập tức đều có Process Explorer! technet.microsoft.com/en-us/sysiternals/bb896653.aspx
Jarrod Dixon

1

Không phải là câu trả lời, nhưng một ý tưởng giải quyết trong trường hợp không có cách nào để "mở khóa" tệp đó mà không khởi động lại máy chủ IIS:

Điều gì xảy ra nếu bạn xây dựng / triển khai vào một thư mục trống mới và thay đổi thư mục chính của trang web thành thư mục đó? Bạn phải tạo một tên thư mục mới mặc dù hoặc chuyển đổi giữa hai tên.

Tôi không biết tập tin đó thuộc về thư mục nào. Nếu nó không phải nằm trong thư mục gốc, bạn có thể đặt nó vào một thư mục mới được tạo và tạo một thư mục ảo trỏ đến thư mục đó. Vì vậy, bạn có thể giữ thư mục nhà tiêu chuẩn của bạn cho ứng dụng.


1

Tôi đã từng gặp vấn đề tương tự. Bây giờ tôi đã chuyển sang MSDeploy (Triển khai Web) và bây giờ tôi có thể cập nhật trang web một cách đáng tin cậy mà không dừng lại bất cứ điều gì. Trong thực tế, bước này được viết theo kịch bản trong công cụ xây dựng tự động của chúng tôi và nó diễn ra mọi lúc mà không gặp vấn đề gì. Và nó cũng nhanh thôi.


0

Chắc chắn, dừng dịch vụ IIS. Có lẽ tôi không hiểu điều gì đó, xin lỗi.


2
Nếu bạn đang dừng dịch vụ IIS, bạn sẽ gỡ bỏ tất cả các trang web ...
splattne

Đó là một điều chúng tôi thực sự muốn tránh, vì chúng tôi không muốn trang web CruiseControl.NET của chúng tôi ngừng hoạt động - chúng tôi nhấp vào nút "Làm mới trạng thái" như những kẻ điên trong quá trình xây dựng để kiểm tra thành công!
Jarrod Dixon

Ok, làm thế nào về việc xây dựng một nơi khác trước, sau đó triển khai trên tệp tĩnh thay vì thực hiện mọi thứ trên máy chủ đó?
Mark Allen

không phải là vấn đề ở đây sao? Không ai nói rằng tập tin đã được sửa đổi bởi phần mềm trên chính máy chủ.
FlavorScape

0

lưu ý: không phải là một chuyên gia về ngữ nghĩa khóa tập tin windows

Jarrod, bạn có thể đổi tên tập tin ra khỏi đường đi không. Bạn cũng có thể tạo tệp mới của mình bằng một phần mở rộng tạm thời, sau đó đổi tên nó thành tệp hiện tại.

Nếu ngữ nghĩa khóa tệp windows hoạt động tương tự như POSIX, các trình đọc giữ khóa đọc hiện tại trên tệp, vẫn nên tiếp tục phân phát tệp cũ cho đến khi chúng đóng luồng đọc, trong khi các trình đọc mới sẽ mở tệp mới.


Không, chúng tôi không thể làm gì với tệp cho đến khi IIS được khởi động lại.
Jarrod Dixon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.