Bagaimana cara mendapatkan IIS7 untuk melepaskan file yang terkunci?


25

Selama proses produksi kami, file konten statis yang sangat besar (10 megabyte) di direktori root kadang-kadang akan dikunci oleh IIS dan tidak dapat dihapus oleh tugas bersih. Ini mungkin karena sedang aktif dilayani untuk satu atau lebih klien pada saat itu.

Proses pembuatan menghentikan situs web sebelum membersihkan via

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

Namun, ini tidak merilis file - kita harus me-restart IIS untuk mendapatkan proses untuk melepaskan kuncinya.

appcmd.exememungkinkan Anda untuk menjatuhkan IIS sepenuhnya; kami tidak ingin melakukan ini!

Apakah ada cara lain untuk membuat IIS melepaskan file yang terkunci, tanpa me-restart IIS? Cukup menghentikan dan memulai situs web individu jelas tidak bekerja untuk melepaskan kunci file.


1
Pertanyaan serius sekarang: apakah file statis ini berubah dari build ke build atau hanya file yang tidak akan pernah berubah?
splattne

Hanya pemikiran gila, tapi saya ingin tahu apa yang akan terjadi jika Anda mengaktifkan Shadow Copies di folder ini?
Richard West

Ini sitemap.xml Anda, kan?
Dave Cheney

Ya, itu sitemap.xml kami, tapi sekarang kami hanya memiliki rute MVC untuk itu dan menyimpan pengisap dalam memori. Tidak ada lagi penguncian!
Jarrod Dixon

Jawaban:


12

Ada alat-alat, seperti Process Explorer Sysinternal, yang dapat menemukan dan menutup file secara paksa, namun keadaan dan perilaku aplikasi (baik milik Anda dan, dalam hal ini, IIS) setelah melakukan ini tidak ditentukan. Beberapa tidak akan peduli, beberapa akan error dan yang lain akan crash keras.

Solusi yang benar adalah dengan mengambil pemadaman dan memungkinkan IIS untuk melepaskan kunci dan membersihkan dengan sendirinya untuk menjaga stabilitas server. Jika ini tidak memungkinkan, Anda dapat membuat situs lain di kotak yang sama, atau mengatur kotak baru dengan konten baru, dan memindahkan nama domain / IP untuk "mempromosikan" konten baru ke produksi.


2
+1 untuk proses explorer, mungkin memberi Anda beberapa wawasan untuk dapat memecahkan masalah jika Anda dapat melihat utas apa yang menahan file tersebut terbuka
Nick Kavadias

Mungkin sangat berguna merilis file terkunci secara terprogram menggunakan alat Sysinternals dengan Powershell , C # atau skrip bat-cmd
Kiquenet

Saya mempunyai IIS untuk membuka kunci file atau direktori hanya dengan mencoba menyalin file ke folder yang dikontrol IIS dan kemudian melihat aplikasi web di browser. Terkadang proses ini membuka pegangan itu.
Marc Noon

13

Saya menggunakan alat kecil yang disebut "Menangani" untuk melakukan ini.

Anda pada dasarnya memberikan nama file yang dikunci dan memberi tahu Anda proses apa yang menggunakannya:

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

Kemudian Anda memberikan sakelar -c untuk menutupnya:

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

Anda mungkin kesulitan untuk mengerjakannya dalam skrip pembuatan tanpa program pembungkus untuk mengurai output tetapi mudah-mudahan ini akan membantu.


Mark Russinovich yang perkasa untuk menyelamatkan - saya akan memeriksanya, tetapi peringatan buruk Handle tentang ketidakstabilan program ketika secara paksa menutup pegangan membuat saya gugup.
Jarrod Dixon

Semoga ketidakstabilan apa pun akan terbatas pada AppPool yang dimaksud. Jika itu masalahnya, maka Anda bisa melakukan restart AppPool setelah Anda melepaskan kunci.
Simon Johnson

@ Jarrod: ada keberuntungan? Bisakah Anda memposting hasil apa pun, naik ke posting asli Anda? Saya ingin melihat apa yang terjadi di sini, di belakang layar.
Pure.Krome

Mungkin sangat berguna merilis file terkunci secara terprogram menggunakan Handle with Powershell , C # atau script bat-cmd dan mendapatkan proses yang mengunci folder
Kiquenet

5

Saya tidak yakin apakah maksud Anda kompilasi file aspx di majelis sementara. Kami menggunakan proyek penyebaran ASP.NET , yang mengkompilasi semua file aspx / ascx sebelumnya.

Saat menyalin file biner dari folder "publikasikan" ke folder "bin", kami sementara mengaktifkan file app_offline.htm yang dihapus setelah semua rakitan disalin (hanya beberapa detik). Dengan cara ini saya tidak pernah mengalami kunci file.

EDIT:

Anda dapat mencoba mendaur ulang kumpulan aplikasi menggunakan appcmd.exe, alih-alih menghentikan situs web:

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

1
Tidak, itu hanya file konten statis di direktori root - memperbarui pertanyaan dengan info itu!
Jarrod Dixon

1
Saya kira Anda menggunakan app_offline.htm selama exection pekerjaan build Anda?
splattne

Saya pikir kami telah mencoba daur ulang secara manual tetapi tidak berhasil, tetapi kami akan mencobanya lagi lain kali ada kunci (kumpulan aplikasi untuk .NET, bukan? Mungkin tidak akan membantu di sini). Dan kami dulu memiliki file app_offline.htm dibuat, tetapi tidak membantu dengan penguncian - itulah sebabnya kami pindah ke mengambil situs individu.
Jarrod Dixon

Aku khawatir kamu benar. Saya akan menguji ini di salah satu server kami dan kembali kepada Anda.
splattne

1
@plattne: Daur ulang kumpulan aplikasi seharusnya menghapus pegangan asalkan file dibuka oleh situs web. Jika daur ulang kolam tidak membantu maka tebakan saya adalah sesuatu yang lain mengunci file.
pbz


1

Memproses Memantau akan membantu Anda dengan penyelidikan Anda, inilah contoh dari blog Mark ( yang orang yang menulis alat) tentang cara menemukan file pegangan.

Anda mungkin ingin mencoba alat Unlocker ini untuk mengotomatiskan pembukaan kunci Anda di tingkat pegangan file.


Keren, saya belum pernah menggunakan Process Monitor; tetapi setiap workstation yang saya gunakan segera mendapatkan Process Explorer! technet.microsoft.com/en-us/sysinternals/bb896653.aspx
Jarrod Dixon

1

Bukan jawabannya, tetapi sebuah ide penyelesaian jika tidak ada cara untuk "membuka" file itu tanpa me-restart server IIS:

Bagaimana jika Anda membangun / menyebarkan ke folder kosong baru dan mengubah direktori home situs web ke folder itu? Anda harus membuat nama folder baru atau beralih di antara dua nama.

Saya tidak tahu di folder mana file itu berada. Jika tidak harus berada di folder root, Anda bisa meletakkannya di folder yang baru dibuat dan membuat direktori virtual yang menunjuk ke folder itu. Jadi Anda dapat menyimpan direktori home standar Anda untuk aplikasi tersebut.


1

Saya memiliki masalah yang sama. Sekarang saya beralih ke MSDeploy (Web Deploy) , dan sekarang saya dapat memperbarui situs web dengan andal tanpa menghentikan apa pun. Sebenarnya langkah ini dituliskan dalam alat pembuatan otomatis kami dan ini terjadi setiap saat tanpa masalah. Dan juga cepat.


0

Tentu, hentikan layanan IIS. Mungkin saya tidak mengerti sesuatu, maaf.


2
Jika Anda menghentikan layanan IIS, Anda akan menghapus semua situs web ...
splattne

Itu adalah satu hal yang kami benar-benar ingin hindari, karena kami tidak ingin situs CruiseControl.NET kami turun - kami mengklik tombol "Refresh Status" seperti orang gila selama membangun untuk memeriksa kesuksesan!
Jarrod Dixon

Oke, bagaimana kalau membangun di tempat lain dulu, lalu menggunakan file statis alih-alih melakukan segalanya di server itu?
Mark Allen

bukankah itu masalahnya di sini? Tidak ada yang mengatakan file itu sedang dimodifikasi oleh perangkat lunak pada server itu sendiri.
FlavourScape

0

Catatan: bukan ahli semantik penguncian file windows

Jarrod, apakah Anda dapat mengubah nama file keluar dari jalan. Anda juga dapat membuat file baru dengan ekstensi sementara, dan kemudian mengganti namanya menjadi file saat ini.

Jika semantik penguncian file windows bekerja mirip dengan POSIX, pembaca yang memegang kunci baca saat ini pada file, harus tetap melanjutkan melayani file lama sampai mereka menutup aliran baca mereka, sementara pembaca baru akan membuka file baru.


Tidak, kami tidak dapat melakukan apa pun pada file tersebut hingga IIS dimulai kembali.
Jarrod Dixon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.