จะทำให้ IIS7 ปล่อยไฟล์ที่ล็อคได้อย่างไร


25

ในระหว่างการสร้างงานสร้างไฟล์เนื้อหาสแตติกขนาดใหญ่ (10 เมกะไบต์) ในไดเรกทอรีรากบางครั้งจะถูกล็อคโดย IIS และไม่สามารถลบได้โดยงานที่สะอาด นี่อาจเป็นเพราะมีการให้บริการกับลูกค้าตั้งแต่หนึ่งรายขึ้นไป

กระบวนการสร้างหยุดเว็บไซต์ก่อนที่จะทำความสะอาดผ่าน

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

อย่างไรก็ตามนี่ไม่ได้ปล่อยไฟล์ - เราต้องเริ่มต้น IIS ใหม่เพื่อให้กระบวนการปลดล็อค

appcmd.exeให้คุณใช้ IIS ได้อย่างสมบูรณ์ เราไม่ต้องการทำสิ่งนี้!

มีวิธีอื่นในการให้ IIS ปล่อยไฟล์ที่ถูกล็อคโดยไม่ต้องเริ่มต้น IIS ใหม่หรือไม่? เพียงหยุดและเริ่มเว็บไซต์แต่ละแห่งไม่ทำงานเพื่อปลดล็อคไฟล์


1
คำถามที่จริงจังตอนนี้: ไฟล์สแตติกนี้เปลี่ยนจาก build เป็น build หรือไม่หรือเป็นเพียงไฟล์ที่จะไม่เปลี่ยนแปลง
splattne

แค่คิดบ้า แต่ฉันสงสัยว่าจะเกิดอะไรขึ้นถ้าคุณเปิดใช้งาน Shadow Copies ในโฟลเดอร์นี้?
Richard West

นี่คือ sitemap.xml ใช่ไหม
Dave Cheney

ใช่มันคือ sitemap.xml ของเรา แต่ตอนนี้เรามีเส้นทาง MVC แล้วและแคชตัวดูดในหน่วยความจำ ไม่มีการล็อคอีกต่อไป!
Jarrod Dixon

คำตอบ:


12

มีเครื่องมือเช่น Process Explorer ของ Sysinternal ที่สามารถค้นหาและบังคับให้ปิดการจัดการไฟล์ได้อย่างไรก็ตามสถานะและพฤติกรรมของแอปพลิเคชัน (ทั้งของคุณและในกรณีนี้ IIS) หลังจากทำเช่นนี้ไม่ได้กำหนด บางคนไม่สนใจบางคนจะผิดพลาดและคนอื่นจะล้มเหลว

ทางออกที่ถูกต้องคือการหยุดทำงานและอนุญาตให้ IIS ปลดล็อคอย่างปลอดภัยและล้างข้อมูลหลังจากนั้นเพื่อรักษาเสถียรภาพของเซิร์ฟเวอร์ หากเป็นไปไม่ได้คุณสามารถสร้างเว็บไซต์อื่นในกล่องเดียวกันหรือตั้งค่ากล่องใหม่ด้วยเนื้อหาใหม่และย้ายชื่อโดเมน / IP ไปที่ "ส่งเสริม" เนื้อหาใหม่ไปยังการผลิต


2
+1 สำหรับขั้นตอนการสำรวจก็อาจทำให้คุณเข้าใจบางอย่างในความสามารถในการแก้ปัญหาหากคุณสามารถมองเห็นสิ่งด้ายถือจับไฟล์ที่เปิด
Nick Kavadias

อาจเป็นประโยชน์อย่างมากที่ปล่อยไฟล์ที่ถูกล็อค โดยทางโปรแกรมโดยใช้เครื่องมือ Sysinternals กับPowershell , C #หรือสคริปต์ bat-cmd
Kiquenet

ฉันมี IIS เพื่อปลดล็อกไฟล์หรือไดเรกทอรีเพียงแค่พยายามคัดลอกไฟล์ไปยังโฟลเดอร์ที่มีการควบคุมของ IIS แล้วดูแอปเว็บในเบราว์เซอร์ บางครั้งกระบวนการนี้จะปลดล็อคที่จับเหล่านั้น
Marc Noon

13

ฉันใช้เครื่องมือเล็กน้อยที่เรียกว่า"จัดการ"เพื่อทำสิ่งนี้

โดยพื้นฐานแล้วคุณจะใช้ชื่อของไฟล์ที่ถูกล็อคและมันบอกคุณว่ากระบวนการใช้มันอย่างไร:

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

อาจเป็นประโยชน์อย่างมากที่ปล่อยไฟล์ที่ถูกล็อค โดยใช้โปรแกรมด้วยHandle with Powershell , C #หรือสคริปต์ bat-cmdและรับกระบวนการที่ล็อคโฟลเดอร์
Kiquenet

5

ฉันไม่แน่ใจว่าคุณหมายถึงการรวบรวมไฟล์ aspx ในแอสเซมบลีชั่วคราวหรือไม่ เรากำลังใช้โครงการปรับใช้ ASP.NETซึ่งรวบรวมไฟล์ aspx / ascx ทั้งหมดไว้ล่วงหน้า

ในขณะที่คัดลอกไฟล์ไบนารีจาก "เผยแพร่" ไปยังโฟลเดอร์ "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

2

ฉันลองตอนนี้: เห็นได้ชัดว่าอาจมีปัญหากับการล็อคไฟล์หากคุณเปิดใช้งานการจัดทำดัชนีในไดเรกทอรี http://www.richard-banks.org/2008/04/how-to-fix-problems-with-locked-files.html

นี่คือ IIS 6.0 แต่เนื่องจากดูเหมือนว่าจะเกี่ยวข้องกับระบบปฏิบัติการและไม่ใช่ IIS จึงอาจเป็นสาเหตุหลัก


1

กระบวนการตรวจสอบจะช่วยให้คุณกับการสอบสวนของคุณที่นี่เป็นตัวอย่างจากบล็อกมาร์ก ( ผู้ชายที่เขียนเครื่องมือ) เกี่ยวกับวิธีการที่จะหาจับไฟล์

คุณอาจต้องการลองใช้เครื่องมือ Unlockerนี้เพื่อปลดล็อกอัตโนมัติที่ระดับการจัดการไฟล์


เยี่ยมมากฉันไม่เคยใช้การตรวจสอบกระบวนการ แต่ทุกเวิร์กสเตชันที่ฉันใช้ทันทีจะได้รับ Process Explorer! technet.microsoft.com/en-us/sysinternals/bb896653.aspx
Jarrod Dixon

1

ไม่ใช่คำตอบ แต่เป็นวิธีการแก้ปัญหาในกรณีที่ไม่มีวิธี "ปลดล็อก" ไฟล์นั้นโดยไม่ต้องรีสตาร์ทเซิร์ฟเวอร์ IIS:

ถ้าคุณสร้าง / ปรับใช้กับโฟลเดอร์ว่างใหม่และเปลี่ยนโฮมไดเรกทอรีของเว็บไซต์เป็นโฟลเดอร์นั้น คุณต้องสร้างชื่อโฟลเดอร์ใหม่หรือสลับไปมาระหว่างสองชื่อ

ฉันไม่ทราบว่าอยู่ในโฟลเดอร์ใดของไฟล์ หากไม่จำเป็นต้องอยู่ในโฟลเดอร์รูทคุณสามารถวางไว้ในโฟลเดอร์ที่สร้างขึ้นใหม่และสร้างไดเรกทอรีเสมือนที่ชี้ไปยังโฟลเดอร์นั้น ดังนั้นคุณสามารถเก็บไดเรกทอรีบ้านมาตรฐานของคุณสำหรับแอปพลิเคชัน


1

ผมมีปัญหาเหมือนกัน. ตอนนี้ฉันเปลี่ยนเป็นMSDeploy (Web Deploy)และตอนนี้ฉันสามารถอัปเดตเว็บไซต์ได้อย่างน่าเชื่อถือโดยไม่หยุดอะไรเลย อันที่จริงขั้นตอนนี้ถูกเขียนสคริปต์ในเครื่องมือสร้างอัตโนมัติของเราและมันเกิดขึ้นตลอดเวลาโดยไม่มีปัญหาใด ๆ และมันก็เร็วเช่นกัน


0

แน่นอนหยุดบริการ IIS บางทีฉันอาจไม่เข้าใจบางสิ่งบางอย่างขอโทษ


2
หากคุณกำลังหยุดบริการ IIS คุณจะใช้เวลาลงเว็บไซต์ทั้งหมด ...
splattne

นั่นคือสิ่งหนึ่งที่เราต้องการหลีกเลี่ยงเพราะเราไม่ต้องการให้เว็บไซต์ CruiseControl.NET หยุดทำงาน - เราคลิกที่ปุ่ม "รีเฟรชสถานะ" เหมือนคนบ้าในระหว่างการสร้างเพื่อตรวจสอบความสำเร็จ!
Jarrod Dixon

ตกลงแล้วจะสร้างที่อื่นก่อนจากนั้นจึงปรับใช้ไฟล์แบบคงที่แทนที่จะทำทุกอย่างบนเซิร์ฟเวอร์นั้น
Mark Allen

นั่นไม่ใช่ปัญหาที่นี่หรือ ไม่มีใครบอกว่าไฟล์ถูกแก้ไขโดยซอฟต์แวร์บนเซิร์ฟเวอร์เอง
FlavourScape

0

หมายเหตุ:ไม่ใช่ผู้เชี่ยวชาญในซีแมนทิกส์การล็อกไฟล์ของ Windows

Jarrod คุณสามารถเปลี่ยนชื่อไฟล์ได้หรือไม่ คุณอาจสร้างไฟล์ใหม่ด้วยนามสกุลชั่วคราวจากนั้นเปลี่ยนชื่อไฟล์ใหม่เป็นไฟล์ปัจจุบัน

หากซีแมนทิกส์การล็อกไฟล์ windows ทำงานคล้ายกับ POSIX ตัวอ่านที่เก็บล็อกการอ่านปัจจุบันบนไฟล์ควรยังคงให้บริการไฟล์เก่าต่อไปจนกว่าพวกเขาจะปิดสตรีมการอ่านในขณะที่ผู้อ่านใหม่จะเปิดไฟล์ใหม่


ไม่เราไม่สามารถทำอะไรกับไฟล์ได้จนกว่า IIS จะเริ่มต้นใหม่
Jarrod Dixon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.