某索引服務伺服器 C 磁碟機空間嚴重不足,調查發現 C:\Users\ServiceAccount\AppData\Local\Temp 有大量以 GUID 或亂數編號命名的資料夾及檔案,大小高達 70GB,確認是兇手無誤。推測這些暫存檔是建立索引時殘留,是服務的主動刪除機制失效?還是原本便打算放著讓作業系統或系統管理者處理?原因仍待調查,倒是 AppData\Local\Temp 這個暫存目錄,裡面的檔案能不能刪除?會不會自動清理?若不會,如何設定排程處理?之前沒有深入了解,趁此機會研究。

AppData\Local\Temp 目錄下的檔案可以砍嗎?既然名為 Temp,代表屬暫時性質不需永久保存,理論上刪除無妨。看完一些文章與討論,大家普遍的共識是「理論上可刪除,使用中的檔案多半會有鎖定保護」,但別指望有人或有文件掛保證刪除絕不出事,理由很簡單,只要寫支程式把關鍵資料存入 %TEMP% (或 .NET System.Path.GetTempPath()) 又不上鎖防刪,馬上就能當成反面鐵證打臉。所以,AppData\Local\Temp 的檔案到底能不能刪除?若非要我下結論 - 理論上可以刪除,依經驗出問題的機率不高,但如果你人品大爆發的話...

接著來看,有現成工具可以清理 AppData\Local\Temp 嗎?講到這個大家一定馬上會想到 Windows 內建的「磁碟清理」工具(cleanmgr.exe) (註:Windows Server 2016+ 有內建,更早的 Windows Server 版本或 Windows Server Core 需額外安裝 參考),但實測磁碟清理工具的暫存檔並不包含 AppData\Local\Temp,例如:在我的電腦上,AppData\Local\Temp 的大小近 5GB,但磁碟清理工具找到暫存檔大小只有 186MB,看來並沒有把它包含在內:

找資料過程,我還發現 Windows 10 有個 SlientCleanup 排桯 會在閒置或磁碟空間不足時出來清理門戶,不過它背後也是靠「磁碟清理」工具(cleanmgr.exe),即然實測不會刪除 AppData\Local\Temp,也就不指望它了。

關於靠排程清除的做法,我在網路上找到這篇 The Best Way to Automatically Clean Up the Temp Directory on Windows 10,裡面有段刪除暫存目錄下所有檔案與子目錄的批次檔範例:

@echo off
del "%tmp%\*.*" /s /q /f
FOR /d %%p IN ("%tmp%\*.*") DO rmdir "%%p" /s /q

如果要更細緻一些,可以考量加上篩選條件,例如,只刪除一個月以前的檔案,但上面做法在大部分情況下已可有效釋放空間,應已堪用。如果有預算且允許在伺服器加裝軟體,CCleaner 之類的軟體可以做到只刪除 48 小時內沒用過的檔案,又更上一層樓。(但這倒也不難,自己寫幾行 C# 或 PowerShell 也可以做到就是了)


Comments

# by NesticC

版大,想請問有沒有看過Temp資料夾同樣位置的兄弟 "Temp;" 這個是什麼東西呢? 這比我的Temp大無敵爆炸多 但google都只搜到Temp而已好像查不到"Temp;"相關討論

# by NesticC

我發現我錯了,剛打%Temp% 和 %Tmp%竟然會指到不一樣的資料夾 其中TMP的環境變數內容變成多行的(多行第一條仍然顯示..../Temp 但切到單行編輯就會看到被加分號) 應該是因為這樣所以才產生了奇怪的"Temp;"資料夾 想刪但實在有點抖 裡面有好幾十G....

Post a comment