IIS7'nin kilitli bir dosyayı serbest bırakmasını nasıl sağlayabilirim?


25

Yapımlarımız sırasında, kök dizindeki çok büyük (10 megabayt) bir statik içerik dosyası bazen IIS tarafından kilitlenir ve temizleme görevi tarafından silinemez. Bunun muhtemelen o sırada aktif olarak bir veya daha fazla müşteriye sunulması nedeniyle.

Derleme işlemi, temizlemeden önce web sitesini durdurur.

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

Ancak, bu dosyayı serbest bırakmaz - kilidini kaldırmak için işlemi almak için IIS'yi yeniden başlatmamız gerekir.

appcmd.exeIIS'yi tamamen indirmenize izin verir; bunu yapmak istemiyoruz!

IIS'yi yeniden başlatmadan IIS'nin kilitli bir dosyadan çıkmasına izin vermenin başka yolları var mı? Tek yapmanız gereken web sitesini durdurmak ve başlatmak, kesinlikle dosya kilidini açmak için çalışmaz.


1
Şimdi ciddi bir soru: Bu statik dosya yapıdan yapıya değişiyor mu, yoksa hiç değişmeyecek bir dosya mı?
splattne

Sadece çılgınca bir düşünce, ama bu klasörde Gölge Kopyaları etkinleştirirseniz ne olacağını merak ediyorum?
Richard West

Bu, sitemap.xml'niz değil mi?
Dave Cheney

Evet, bizim sitemap.xml'imizdi, ama şimdi sadece bir MVC rotası var ve enayi hafızada önbelleğe alıyor. Artık kilitlenme yok!
Jarrod Dixon

Yanıtlar:


12

Sysinternal'ın İşlem Gezgini gibi, dosya tutamaçlarını bulabilen ve zorla kapatabilecek araçlar vardır, ancak bunu yaptıktan sonra uygulamanın durumu ve davranışı (hem sizin hem de bu durumda IIS) tanımlanmamıştır. Bazıları umursamayacak, bazıları hata yapacak ve diğerleri sert çökecek.

Doğru çözüm, kesinti almak ve IIS'nin sunucu kararlılığını korumak için IIS'nin kilitleri temiz bir şekilde serbest bırakmasını ve kendisinden sonra temizlemesini sağlamaktır. Bu mümkün değilse, aynı kutuda başka bir site oluşturabilir veya yeni içeriğe sahip yeni bir kutu oluşturabilir ve etki alanı adını / IP’yi yeni içeriği üretime tanıtmak için "ilerletmek" için taşıyabilirsiniz.


2
İşlem gezgini için +1 ise, dosya tanıtıcısını açık tutan hangi parçacığı görüyorsanız sorunu çözebilmeniz konusunda size biraz fikir verebilir
Nick Kavadias

Belki de çok yararlı bir şekilde kilitli bir dosyayı Powershell , C # veya betikleri bat-cmd ile Sysinternals araçlarını kullanarak programlanmış olarak kilitli
Kiquenet

Dosyayı veya dizini açmak için IIS'yi yalnızca dosyaları IIS kontrollü klasörüne kopyalamayı deneyerek ve ardından web uygulamasını bir tarayıcıda görüntüleyerek açtım. Bazen bu işlem bu tutamaçların kilidini açar.
Marc Noon,

13

Bunu yapmak için "Sap" adlı küçük bir araç kullanıyorum .

Temelde, kilitli dosyanın adını iletin ve hangi işlemleri kullandığını size söyler:

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

Sonra tutamacı kapatmak için -c anahtarını geçirin:

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

Çıktıyı ayrıştırmak için bir sarmalayıcı program olmadan bir yapı betiğine çalışmak için mücadele edebilirsiniz, ancak umarım bu yardımcı olacaktır.


Kurtarmaya giden güçlü Mark Russinovich - Bunu kontrol edeceğim, ancak Handle'un bir sapı zorla kapattığımda, Handle'ın program kararsızlığı konusundaki korkunç uyarısı beni tedirgin ediyor.
Jarrod Dixon

Umarım herhangi bir istikrarsızlık söz konusu AppPool ile sınırlı olacaktır. Bu durumda, kilidi açtıktan sonra AppPool'ü yeniden başlatmanız yeterlidir.
Simon Johnson

@ Jarrod: herhangi bir şans? Lütfen herhangi bir sonucu yayınlayabilir misiniz? Burada, sahne arkasında ne olduğunu görmeyi çok isterim.
Pure.Krome

Belki çok faydalı yayımlanan kilitli dosya programlı kullanarak Kulpu ile Powershell , C # veya komut yarasa cmd ve bir klasör kilitlemek süreçleri olsun
Kiquenet

5

Geçici derlemelerdeki aspx dosyalarının derlenmesini kastettiğinizden emin değilim. Tüm aspx / ascx dosyalarını önceden derleyen ASP.NET dağıtım projeleri kullanıyoruz .

İkili dosyaları "yayınla" dan "bin" klasörüne kopyalarken, tüm derlemeler kopyalandıktan sonra kaldırılan bir app_offline.htm dosyasını geçici olarak etkinleştiririz (sadece birkaç saniye). Bu sayede dosya kilitlerini hiç yaşamadım.

DÜZENLE:

Uygulama havuzunu, web sitesini durdurmak yerine appcmd.exe kullanarak geri dönüştürmeyi deneyebilirsiniz:

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

1
Hayır, sadece kök dizindeki statik bir içerik dosyasıdır - soruyu bu bilgiyle güncelleyin!
Jarrod Dixon

1
Yaptığınız iş çıkarken app_offline.htm kullanıyorsunuzdur?
splattne

Sanırım boşuna boşuna geri dönüşüm denedik, ancak bir dahaki sefer kilitlendiğinde tekrar deneyeceğiz (uygulama havuzları .NET içindir, değil mi? Muhtemelen burada yardımcı olmaz). Ve biz app_offline.htm dosyasını yaratırdık, ama kilitleme konusunda yardımcı olmadı - bu yüzden bu siteyi tek tek siteye taşımaya başladık.
Jarrod Dixon

Korkarım haklısın. Bunu sunucularımızdan birinde test edeceğim ve size geri döneceğim.
splattne

1
@ splattne: Uygulama havuzunun geri dönüştürülmesi, dosyanın web sitesi tarafından açılması koşuluyla tanıtıcıyı kaldırmış olması gerekir. Eğer havuzun geri dönüşümü işe yaramazsa, tahminimce dosyayı başka bir şey kilitler.
pbz


1

Monitör işleyin Araştırmanızda size yardımcı olmalıdır, burada bir örnek Mark blogunda (gelen dosya tanıtıcısı bulmak için nasıl aracı yazdı adam).

Kilit açma işleminizi bir dosya tanıtıcısı düzeyinde otomatikleştirmek için bu Unlocker aracını denemek isteyebilirsiniz .


Harika, Proses Monitor'ü hiç kullanmadım; ama kullandığım her iş istasyonunda hemen İşlem Gezgini var! technet.microsoft.com/en-us/sysinternals/bb896653.aspx
Jarrod Dixon

1

Cevap değil, ancak IIS sunucusunu yeniden başlatmadan bu dosyayı "kilidini açmanın" mümkün olmadığı durumlarda geçici bir fikir:

Yeni bir boş klasör oluşturup dağıtıp web sitesinin giriş dizinini bu klasöre değiştirirseniz ne olur? Yine de yeni bir klasör adı oluşturmanız veya iki isim arasında geçiş yapmanız gerekir.

Bu dosyanın hangi klasöre ait olduğunu bilmiyorum. Kök klasörde olması gerekmiyorsa, yeni oluşturulan bir klasöre koyabilir ve bu klasörü gösteren sanal bir dizin oluşturabilirsiniz. Böylece uygulama için standart ev dizini tutabilirsiniz.


1

Ben de aynı problemi yaşadım. Şimdi MSDeploy'a (Web Deploy) geçtim ve şimdi web sitesini hiçbir şey durdurmadan güvenilir bir şekilde güncelleyebilirim. Aslında bu adım bizim otomatik derleme aracımızda yazılmıştır ve her zaman sorunsuz bir şekilde gerçekleşir. Ve de hızlı.


0

Elbette, IIS hizmetini durdurun. Belki bir şey anlamıyorum, üzgünüm.


2
IIS hizmetini durduruyorsanız, tüm web sitelerini devre dışı bırakırsınız ...
splattne

CruiseControl.NET sitemizin aşağı inmesini istemediğimizden, gerçekten kaçınmak istediğimiz şey bu - başarıyı kontrol etmek için bir inşa sırasında çılgınlar gibi "Durumu Yenile" düğmesine tıklayın!
Jarrod Dixon

Tamam, önce başka bir yere inşa etmeye, sonra o sunucudaki her şeyi yapmak yerine statik dosyanın üzerine konuşmaya ne dersin?
Mark Allen

buradaki sorun değil mi? Hiç kimse, dosyanın sunucunun kendi yazılımı tarafından değiştirildiğini söylemedi.
FlavorScape

0

Not: Windows dosya kilitleme anlambiliminde uzman

Jarrod, dosyayı yoldan çıkarabilir misin? Ayrıca yeni dosyanızı geçici bir uzantıyla oluşturabilir ve geçerli dosya üzerinde yeniden adlandırabilirsiniz.

Windows dosya kilitleme semantikleri POSIX'lere benzer şekilde çalışıyorsa, dosyada geçerli bir okuma kilidi tutan okuyucular, okuma akışlarını kapatana kadar eski dosyayı sunmaya devam etmeli, yeni okuyucular yeni dosyayı açacaktır.


Hayır, IIS yeniden başlatılıncaya kadar dosyada hiçbir şey yapamıyoruz.
Jarrod Dixon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.