msbuild.exe ยังคงเปิดอยู่ กำลังล็อคไฟล์

ฉันใช้ TeamCity ซึ่งจะเรียกใช้ msbuild (.NET 4) ฉันมีปัญหาแปลก ๆ คือหลังจากที่บิลด์เสร็จสมบูรณ์ (และดูเหมือนว่าจะไม่สำคัญว่าจะเป็นบิลด์ที่ประสบความสำเร็จหรือไม่) msbuild.exe ยังคงเปิดอยู่และล็อคไฟล์ใดไฟล์หนึ่ง ซึ่งหมายความว่าทุกครั้งที่ TeamCity พยายาม เพื่อล้างไดเร็กทอรีงาน ล้มเหลว และไม่สามารถดำเนินการต่อได้

สิ่งนี้เกิดขึ้นเกือบทุกครั้ง

ฉันหลงเรื่องนี้มาก ดังนั้นฉันจะพยายามให้รายละเอียดให้มากที่สุด

  • เซิร์ฟเวอร์คือ Intel Core i7, RAM 2 GB พร้อม Windows Server 2008 มาตรฐาน 64 บิต SP2
  • ใน TeamCity นักวิ่ง msbuild ได้รับการกำหนดค่าด้วยพารามิเตอร์บรรทัดคำสั่ง /m (ซึ่งหมายถึงการใช้หลายคอร์)
  • ไฟล์ที่เป็นปัญหาคือ เสมอ ซึ่งเป็น DLL ภายนอกเดียวกันกับที่อ้างอิงในโครงการ .NET รายการใดรายการหนึ่ง ในเส้นทาง External Tools\Telerik\Telerik.Reporting.Dll (มีไฟล์ .DLL อื่นๆ หลายไฟล์รวมอยู่ใน External Tools dir ในโครงสร้างพาธที่คล้ายกันซึ่งไม่เคยทำให้เกิดปัญหานี้) ขณะนี้เป็นรายงาน Telerik เวอร์ชันทดลอง ในกรณีที่สร้างความแตกต่าง
  • เมื่อปัญหานี้เกิดขึ้น จะมีกระบวนการ msbuild.exe *32 หลายรายการอยู่ในตัวจัดการงานเสมอ: ฉันเชื่อว่ามี 7 กระบวนการ เมื่อใช้ Process Explorer กระบวนการทั้งหมดจะดูเหมือนกระบวนการระดับบนสุด (ไม่มีพาเรนต์) ทั้งหมดใช้ RAM 20-50MB และ CPU 0.0%
  • ถ้าฉันรอ 1-3 นาที กระบวนการ msbuild.exe จะออกเอง จากนั้น TeamCity จะสามารถอัปเดตไดเร็กทอรีงานได้อย่างถูกต้อง
  • หากฉันยุติกระบวนการ msbuild ด้วยตนเอง การอัปเดตของ TeamCity จะทำงานอีกครั้งทันที
  • บริการสร้างดัชนีถูกปิดใน Windows (แม้ว่าสองจุดก่อนหน้านี้จะยืนยันว่า msbuild.exe ทำให้เกิดปัญหา)
  • ไม่มีคุณสมบัติพิเศษใน Telerik.reporting.dll คุณสมบัติ SVN เดียวคือ svn:mime-type = application/octet-stream

มีใครเคยเจอสิ่งนี้มาก่อนหรือไม่?


person gregmac    schedule 12.10.2010    source แหล่งที่มา


คำตอบ (2)


ใช้ msbuild กับ /nr:false

โดยย่อ: MSBuild พยายามทำสิ่งต่าง ๆ มากมายให้รวดเร็ว โดยเฉพาะอย่างยิ่งกับบิลด์แบบขนาน มันจะวางไข่ "โหนด" จำนวนมาก - กระบวนการ msbuild.exe แต่ละรายการที่สามารถคอมไพล์โปรเจ็กต์ได้ และเนื่องจากกระบวนการใช้เวลาเล็กน้อยในการหมุน หลังจากสร้างเสร็จแล้ว กระบวนการเหล่านี้จึงค้างอยู่ (โดยค่าเริ่มต้นเป็นเวลา 15 นาที ฉันคิดว่า ) ดังนั้นหากคุณบังเอิญสร้างอีกครั้งในเร็วๆ นี้ โหนดเหล่านี้สามารถ "นำกลับมาใช้ใหม่" และประหยัดค่าติดตั้งกระบวนการได้ แต่คุณสามารถปิดการใช้งานพฤติกรรมนั้นได้โดยปิด nodeReuse ด้วยตัวเลือกบรรทัดคำสั่งดังกล่าว

ดูสิ่งนี้ด้วย:

person Brian    schedule 12.10.2010
comment
สมเหตุสมผล: ดูเหมือนจะไม่เกิดขึ้นหากฉันลบ /m ตอนนี้ฉันกำลังลองใช้ /m /nr:false ฉันจะใช้งานบิลด์บางส่วนและดูว่าจะเป็นอย่างไร ขอบคุณ - person gregmac; 13.10.2010
comment
ผ่านมาสองสามวันและมีการสร้างหลายสิบครั้งในภายหลัง และมันก็ไม่เกิดขึ้นอีก - ดูเหมือนว่าจะคลี่คลายแล้ว ขอบคุณ - person gregmac; 15.10.2010
comment
คุณจะได้รับ Visual Studio เพื่อสร้างโครงการด้วยตัวเลือก msbuild นั้นได้อย่างไร - person Cameron Taggart; 14.04.2012
comment
ฉันยังอยากจะรู้ แต่จริงๆ แล้วฉันพบข้อผิดพลาดของ Visual Studio 11 Beta สำหรับโปรเจ็กต์ C++/CLI ทำให้เกิดอาการเดียวกัน: connect.microsoft.com/VisualStudio/feedback/details/728912/ - person Cameron Taggart; 14.04.2012
comment
โพสต์นี้ช่วยฉันแก้ปัญหาที่เกี่ยวข้องซึ่งมีบันทึกไว้ที่นี่: - stackoverflow.com/questions/13510465/ - person Jon Rea; 22.11.2012
comment
ลิงก์ด้านบนใช้งานไม่ได้ (หลังจากเข้าสู่ระบบ Microsoft Connect) - person thecoolmacdude; 30.08.2016
comment
@CameronTaggart คุณสามารถเพิ่มตัวเลือกบรรทัดคำสั่ง msbuild ด้วยไฟล์พิเศษที่โฮสต์ในโฟลเดอร์โครงการ/โซลูชันของคุณ ดู docs.microsoft.com/en -us/visualstudio/msbuild/ - person needfulthing; 10.07.2019

หากต้องการปิดใช้งานการใช้โหนดซ้ำภายใน Visual Studio คุณต้องใช้ตัวแปรสภาพแวดล้อม:

MSBUILDDISABLENODEREUSE=1
person dan    schedule 23.05.2012
comment
ฉันใช้สิ่งนี้อย่างมีประสิทธิภาพ แต่มีเครื่องมืออื่นที่ล้มเหลวในขณะนี้ เมื่อคอมไพล์ C++ กับ VS11 Beta นั่นคือ mt.exe มีตัวแปรอื่นใดที่จะใช้สำหรับสิ่งนั้นหรือไม่ - person Eugenio Miró; 28.05.2012
comment
ไม่สามารถตั้งค่าโดยใช้กล่องโต้ตอบที่ไหนสักแห่งใน VS ได้หรือไม่ - person dom_beau; 29.11.2012
comment
@dan ขอขอบคุณอย่างจริงใจที่ค้นหาสิ่งนี้ และฉัน สวดภาวนา มีตัวแปรสภาพแวดล้อมเพื่อปิดการใช้งาน Microsoft.VisualStudio.Web.Host.exe เช่นกัน - person jerhewet; 23.04.2015
comment
นอกจากนี้ยังใช้งานได้เมื่อรันบิลด์จากบรรทัดคำสั่ง เช่น สคริปต์แบตช์ บิลด์เซิร์ฟเวอร์ ฯลฯ - person Dave E; 01.02.2016