昨天客戶系統突然有支批次程式執行時發生刪除資料夾失敗,但因為營運環境不能安裝額外的工具程式來觀察,筆記兩個攻城師常用的工具可以調查被誰佔據了:
- Windows內建的工具Resource Monitor
- 需要額外下載的Windows工具Process Monitor。
營造鎖定的情境
為了營造客戶發生的情境,我們先在C:\Temp\下新增一個delete資料夾。
接著打開cmd,切到C:\Temp\delete目錄
ok,營造好資料夾被抓到的情境了,接著來寫一段C#程式來刪除資料夾
[TestMethod]
public void TestMethod1()
{
//要移除的目錄名稱。
//若要移除 path 中的目錄、子目錄和檔案,則為 true;否則為 false。
System.IO.Directory.Delete(@"C:\Temp\delete", true);
}
執行測試
果然刪除資料夾失敗,錯誤訊息: 由於另一個處理序正在使用檔案,所以無法存取該檔案。
查詢檔案或資料夾被誰抓住(Performance Monitor)
Windows鍵 + R 輸入 perfmon /res
打開資源監視器
CPU > 關聯控制代碼 > 輸入資料夾路徑 C:\temp\delete > 按下搜尋
找到兇手了,是一個Process ID = 11628的cmd程式。
查詢檔案或資料夾被誰抓住(Process Monitor)
也可以透過technet連結下載process monitor來觀察!
process monitor是一個可以讓我們監控檔案和Registry存取的監控程式,這次我們來用監控檔案存取的功能。
1.下載好後,執行procmon.exe
2.Process Monitor本人
3.按下Ctrl + L 打開Process Monitor filter
選Path > Contains > 條件C:\temp\delete > Add > OK
4.查詢結果:
也找到兇手了!Process id = 11628的cmd.exe
把之前登入的檔案總管關閉後,批次重新執行就順利過關了。
小結:
- 記得遠端登入桌面(mstsc)後,記得要關閉檔案總管(Explorer)
- 其他的檢查工具: Process Explorer、wholockme。
參考: